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

相关文章

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语