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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”