qt ui设计界面 创建信号与槽 原理,

2024-09-05 23:48

本文主要是介绍qt ui设计界面 创建信号与槽 原理,,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在ui设计界面,设计信号和槽时,会把信息存在ui文件中,在编译时会在成成的头文件**.h 中把连接代码加上。

ui界面添加信号和槽有两种方法

第一种: 在界面选择操作对象-》右键-》转到槽-》选择信号-》qtCreator 自动生成 槽方法-》编写槽方法。此方法在ui文件中并不会保存响应信号与槽信息,因为它生成的槽格式固定,如on_countBtn_clicked。在编译时加入QMetaObject::connectSlotsByName(MainWindow);方法就可以自动按照 方法名 映射为相应的connect。

第二种 :在编辑界面下方


此方法会在ui文件中生成 相应的connect 信息,在编译时,会在**.h头文件中加入

 connect(lineEdit,SIGNAL(textChanged(QString)),this,SLOT(showArea()));方法。
 
 
 
以下为第一种方法原理说明

查看Qt5的一些示例项目的时候,使用设计器打开其UI文件,在文件中竟然找不到signal和slot的连接。但是最终的程序,slot却又能准确的响应信号。打开通过ui文件自动生成的c++文件,其中也找不到connect语句,到底是怎么一回事?

  
  经过逐语句的分析。终于发现连接的原因就在于setUi函数的最后一句
  
  QMetaObject::connectSlotsByName(MainWindow);


  
   找到该静态函数
  
  
void QMetaObject::connectSlotsByName(QObject *o){if (!o)return;const QMetaObject *mo = o->metaObject();Q_ASSERT(mo);const QObjectList list = qFindChildren(o, QString());for (int i = 0; i < mo->methodCount(); ++i) {const char *slot = mo->method(i).signature();Q_ASSERT(slot);//以下一行用来判断slot的前三位是否是on_,如果不是,就跳过这个方法。if (slot[0] != 'o' || slot[1] != 'n' || slot[2] != '_')continue;bool foundIt = false;//遍历子对象。for(int j = 0; j < list.count(); ++j) {const QObject *co = list.at(j);//得到子对象名。QByteArray objName = co->objectName().toAscii();int len = objName.length();//要求slot跳过前3位(on_)后,接下来的子字符串和子对象名相同,并且接着该子字符串又是一个_//如果达不到这个要求,continueif (!len || qstrncmp(slot + 3, objName.data(), len) || slot[len+3] != '_')continue;const QMetaObject *smo = co->metaObject();int sigIndex = smo->indexOfMethod(slot + len + 4);if (sigIndex < 0) { // search for compatible signalsint slotlen = qstrlen(slot + len + 4) - 1;//搜索该子对象所能引发的信号for (int k = 0; k < co->metaObject()->methodCount(); ++k) {//方法类型如果符合要求if (smo->method(k).methodType() != QMetaMethod::Signal)continue;//如果slot最后的子字符串和信号名相同if (!qstrncmp(smo->method(k).signature(), slot + len + 4, slotlen)) {sigIndex = k;break;}}}if (sigIndex < 0)continue;//连接操作if (QMetaObject::connect(co, sigIndex, o, i)) {foundIt = true;break;}}//连接成功if (foundIt) {// we found our slot, now skip all overloadswhile (mo->method(i + 1).attributes() & QMetaMethod::Cloned)++i;}//连接失败else if (!(mo->method(i).attributes() & QMetaMethod::Cloned)) {qWarning("QMetaObject::connectSlotsByName: No matching signal for %s", slot);}}}


  
   得出此结论:自动生成的文件中,该函数总会存在setUi函数的最后一句。
  
  该函数的作用就是寻找setUi的唯一指针参数MainWindow所指向对象的成员函数,

  
  该成员函数的名字如果满足以下条件,就做连接操作。
  
  函数名规则:on_子对象名_信号名
  
  函数签名(即返回值与参数要符合slot要求)
  
  所以,我们可以这样做:在qt设计器中添加按纽或者菜单项或者按纽项后,不用在设计器中手动做连接操作。
  
  我们只要在主窗口类中添加符合条件的成员函数即可。
  
  函数名规则:on_子对象名_信号名
  
  函数签名(即返回值与参数要符合slot要求)
  
  例如:
  
  在设计器中添加一个菜单项,其对应的action为actionNew
  
  那么在主窗口类中添加以下的函数
  
  public slots:
  
   void on_actionNew_triggered();
  
  当切换这个菜单时,会自动执行上面的成员函数。

这篇关于qt ui设计界面 创建信号与槽 原理,的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140404

相关文章

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

全屋WiFi 7无死角! 华硕 RP-BE58无线信号放大器体验测评

《全屋WiFi7无死角!华硕RP-BE58无线信号放大器体验测评》家里网络总是有很多死角没有网,我决定入手一台支持Mesh组网的WiFi7路由系统以彻底解决网络覆盖问题,最终选择了一款功能非常... 自2023年WiFi 7技术标准(IEEE 802.11be)正式落地以来,这项第七代无线网络技术就以超高速

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创