Qt信号与槽机制

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Qt信号与槽机制

一、简介

就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。

信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信。

  • 信号当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。
  • 用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。
  • 信号与槽的连接所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。

connect(sender, SIGNAL(signal), receiver, SLOT(slot));

其中 sender 与 receiver 是指向对象的指针,SIGNAL() 与 SLOT() 是转换信号与槽的宏。

二、特点

  • 一个信号可以连接多个槽当信号发射时,会以不确定的顺序一个接一个的调用各个槽。
  • 多个信号可以连接同一个槽即无论是哪一个信号被发射,都会调用这个槽。
  • 信号直接可以相互连接发射第一个信号时,也会发射第二个信号。
  • 连接可以被移除这种情况用得比较少,因为在对象被删除时,Qt会自动移除与这个对象相关的所有连接。语法如下:

disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));

三、应注意的问题

  1. 信号与槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时也有可能产生死循环。因此,在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。例如 , 在前面给出的例子中如果在 mySlot() 槽函数中加上语句 emit mySignal() 即可形成死循环。
  2. 如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的。
  3. 宏定义不能用在 signal 和 slot 的参数中。
  4. 信号和槽的参数个数与类型必须一致。

四、程序举例

这个demo程序由一个LabelPushButton组成,第一个例子中点击按钮,可以让label关闭,这是最简单的信号与槽的连接;第二例子中点击按钮,在label上获取当前系统时间,这个涉及到的知识点有:信号与槽的参数类型不同时如何连接、自定义槽函数、自定义信号。

首先,新建一个Qt GUI程序,父窗口选为QDialog,类名为getTime,在头文件和CPP文件分别加入如下代码:

头文件:

添加图片注释,不超过 140 字(可选)

实现文件:

添加图片注释,不超过 140 字(可选)

保存、编译、运行之后点击按钮即可看到label消失了。

然后在头文件中加入自定义的槽函数和信号,并在CPP文件中实现槽函数,具体如下:

头文件:

添加图片注释,不超过 140 字(可选)

实现文件:

添加图片注释,不超过 140 字(可选)

然后保存,编译运行即可,点击按钮后就能看到label上显示当前时间了。


五、实例(一)

#include <QAPPlication> #include <QPushButton> int main (int argc, char *argv[]) {       QApplication app(argc, argv);       QPushButton *button = new QPushButton("Close");       QObject::connect(button, SIGNAL(clicked()), button, SLOT(close()));       button->show();      return app.exec(); }

输入以下指令编译:

qmake -project

qmake

make

运行程序:

添加图片注释,不超过 140 字(可选)

点击按钮“Close”,窗口会关闭。


六、实例(二)

使用Qt Creator创建一个工程

添加图片注释,不超过 140 字(可选)

如何让界面在用户单击了“Close”按钮后立刻消失,当然是connect一下clicked和close就搞定了。接下来看具体怎么做?双击signalslotdialog.ui进入designer

添加图片注释,不超过 140 字(可选)

拖放一个Push Button到空间放置区,并修改text属性为“Close”

添加图片注释,不超过 140 字(可选)

单击Qt Creator的“编辑(Edit)”菜单,在弹出的子菜单里面点选“编辑信号/槽(Edit signals/slots)”,此时,当鼠标移动到“Close”按钮上时,按钮颜色变了。然后单击按钮,拖动鼠标到对话框的空白处,会看到下图所示界面

添加图片注释,不超过 140 字(可选)

当松开鼠标左键,弹出“配置连接(Configure Connection)”对话框如图所示:

添加图片注释,不超过 140 字(可选)

设置如下图,单击“确定”

添加图片注释,不超过 140 字(可选)

这样就connect了信号clicked和槽close

添加图片注释,不超过 140 字(可选)

单击

添加图片注释,不超过 140 字(可选)

编译运行出现如下界面

添加图片注释,不超过 140 字(可选)

单击“Close”按钮,界面就退出。

相关文章
|
20天前
|
编译器
(9)Qt中信号与槽重载的解决方案
本文介绍了在Qt中处理信号与槽重载问题的三种解决方案:使用函数指针、Qt提供的QOverload类和Qt4的宏方式。
63 3
|
20天前
(8)Qt中的自定义信号
本文介绍了如何在Qt框架中创建和使用自定义信号,并通过一个父子窗口切换的示例来展示自定义信号的实现和应用。
48 3
(8)Qt中的自定义信号
|
3月前
|
程序员 C++
【Qt】信号与槽(下)
【Qt】信号与槽(下)
|
3月前
|
Linux C++
【Qt】信号与槽(上)
【Qt】信号与槽(上)
【Qt】信号与槽(上)
|
3月前
【qt】有点意思的信号与槽
【qt】有点意思的信号与槽
18 0
|
3月前
【qt】QTcpSocket相关的信号
【qt】QTcpSocket相关的信号
16 0
|
4月前
|
调度
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
145 6
|
5月前
|
C++
Qt信号和槽
Qt信号和槽
|
4月前
|
C++
Qt中的信号与槽如何学习?(包括自定义信号)这篇文章告诉你
以现实中的事件来举例的话,例如有两把不同颜色的信号枪,分别是红色,绿色,打响不通颜色的信号枪会触发不同的槽发生,比如说打响红色这个人就跑步,绿色就走步,但是还有一个很重要的机制,那就是连接,我们需要把信号枪去跟这个人的动作连接起来。 如果上面理解没问题的话我们可以把信号和槽看成两个工具,我们最重要的是如何去把这两个工具连接起来。 它的作用可以让我们更加灵活的去使用不同窗口间的切换以及某些事件的连接。