槽和普通成员函数一样,可以是虚函数、被重载,可以是公有、私有、保护的。它可以被其它C++成员函数调用。

槽连接了信号,当发射这个信号时,槽会被自动调用。

连接函数:

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection )

sender和receiver是指向QObject的指针。

signal和method是不带参数名的函数,需要使用宏SIGNAL()和SLOT()。

一个信号可以连接多个槽,例如:

connect(okButton, SIGNAL(clicked(bool)),

checkBox1, SLOT(click()));

connect(okButton, SIGNAL(clicked(bool)),

checkBox2, SLOT(click()));

当点击okButton时,checkBox1和checkBox2都会执行各自的槽click()。

多个信号可以连接同一个槽,例如:

connect(okButton, SIGNAL(clicked(bool)),

checkBox1, SLOT(click()));

connect(cancelButton, SIGNAL(clicked(bool)),

checkBox1, SLOT(click()));

点击okButton或cancelButton时,checkBox1都会执行槽click()。

一个信号可以与另个一个信号连接,例如:

connect(okButton, SIGNAL(clicked(bool)),

checkBox1, SLOT(click()));

connect(cancelButton, SIGNAL(clicked(bool)),

okButton, SIGNAL(clicked(bool)));

当点击cancelButton时,会由okButton的信号clicked(bool)做响应,okButton会发射信号clicked(bool),从而checkBox1的槽click()会自动执行。

另外,cancelButton的信号clicked(bool)中的bool参数会传递给okButton的信号clicked(bool)中的bool参数。

在这里okButton的clicked(bool)信号被当作槽来使用,槽中有多少个参数,就会要求发射信号的函数至少要带有多少个参数,否则连接是不成功的。

连接可以被移除,例如:

connect(okButton, SIGNAL(clicked(bool)),

checkBox1, SLOT(click()));

disconnect(okButton, SIGNAL(clicked(bool)),

checkBox1, SLOT(click()));

当删除对象时,Qt会自动删除与这个对象相关的所有连接。

信号的参数数量至少是槽的参数数量。

1.例如:

connect(okButton, SIGNAL(clicked(bool)),

checkBox1, SLOT(click()));

当发射信号时,信号的bool参数是没有用的。

2.例如:

connect(okButton, SIGNAL(clicked(bool)),

checkBox1, SLOT(setHidden(bool));

当发射信号时,信号的bool参数会传递给槽的bool参数。

3.例如:

connect(checkBox1, SIGNAL(released()),

cancelButton, SLOT(setVisible(bool)));

这是错误的,槽要求一个bool参数,信号也必须有这一个bool参数。

4.例如:

connect(this, SIGNAL(send(bool, int, double)),

this, SLOT(recive(bool, int)));

信号的参数个数可以大于等于槽的参数个数,同时信号和槽的各个参数位置需要对应。

在这里,信号的第三个参数double类型不会被传递到槽。

在成员函数中手动发射信号,使用emit,例如:

在对象创建时,构造函数就已经连接了setVal信号和recive槽。

当对象调用SetValue()函数时,全发射setVal信号,同时传入相应的参数值,发射信号之后会由recive槽接收,设置val变量的值。

好咯,这一节的总结就到这里~

【Qt】2.2 继续了解信号和槽的更多相关文章

  1. Qt: qobject_cast<QPushButton*>(sender()) 简化信号与槽的编写

    当你觉得写代码是一件重复性极高的工作时,这时你就应该考虑换个方式来实现了. 提高代码效率,减少代码量. 代码片: void Widget::onClicked() { QPushButton* but ...

  2. Qt源码分析之信号和槽机制

    Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个 ...

  3. Qt入门(3)——信号和槽

    信号和槽用于对象间的通讯.信号/槽机制是Qt的一个中心特征并且也许是Qt与其它工具包的最不相同的部分.在图形用户界面编程中,我们经常希望一个窗口部件的一个变化被通知给另一个窗口部件.更一般地,我们希望 ...

  4. Qt Quick快速入门之信号、槽

    信号和槽主要用于组件之间的通信,类似于.net和java中的委托. 使用QObject::connect方法将信号与槽关联起来,然后信号的发起者发出信号,接受者中的槽函数就会执行. 比如connect ...

  5. Qt源码分析之信号和槽机制(QMetaObject是一个内部struct)

    Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个 ...

  6. 第15.19节 PyQt(Python+Qt)入门学习:自定义信号与槽连接

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 本文利用中介绍了PyQt中的信号和槽机制,除了使用PyQt组件的已有信号外,PyQt和Qt ...

  7. QT学习日记篇-02-QT信号和槽

    课程大纲: <1>给控件改名字 随着UI界面的控件变多,如果使用系统自带的名称,后期会让人不明觉厉,说白了,就是掌握C++的命名规则:易懂,条例清晰,人性化 方法:直接点击控件,进入右侧对 ...

  8. Qt error ------ qRegisterMetaType() 跨线程信号与槽的形参携带

    Qt提示: QObject::connect: Cannot queue arguments of type 'FrequencySpectrum' (Make sure 'FrequencySpec ...

  9. Qt ------ QWidget 自定义子类使用信号与槽(Q_OBJECT)后 stylesheet 失效

    这个应该属于 Qt 的一个bug,Qt assistant 给出相应的解决办法:重写函数“void paintEvent(QPaintEvent *event);”,添加下面截图中的一段代码

  10. QT 的信号与槽

    转载: QT 的信号与槽机制介绍 QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 ...

随机推荐

  1. 制作Docker镜像的两种方式

    此文已由作者朱笑天授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.使用docker commit命令制作docker镜像 1. pull一个centos6.6的基础镜像, ...

  2. SCUT - 114 - 作业之数学篇 - 杜教筛

    https://scut.online/p/114 \(A(n)=\sum\limits_{i=1}^{n} \frac{lcm(i,n)}{gcd(i,n)}\) \(=\sum\limits_{i ...

  3. 洛谷 - UVA11424 - GCD - Extreme (I) - 莫比乌斯反演 - 整除分块

    https://www.luogu.org/problemnew/show/UVA11424 原本以为是一道四倍经验题来的. 因为输入的n很多导致像之前那样 \(O(n)\) 计算变得非常荒谬. 那么 ...

  4. memcached连接说明

    memcached 客户端与服务器端通信使用的基于文本的协议,不是二进制,可通过Telnet进行互交

  5. [Xcode 实际操作]二、视图与手势-(7)UIView视图的渐变填充

    目录:[Swift]Xcode实际操作 本文将演示创建一个具有渐变填充色的图形 import UIKit class ViewController: UIViewController { overri ...

  6. Integrated Metabolomics and Lipidomics Analyses Reveal Metabolic Reprogramming in Human Glioma with IDH1 Mutation (文献分享一组-黄旭蕾)

    题目:Integrated Metabolomics and Lipidomics Analyses Reveal Metabolic Reprogramming in Human Glioma wi ...

  7. git合并某次提交到某个分支

    有的时候,在develop分支开发,是大家公用的开发分支,但是只想合并自己提交的到master,如何操作呢?那就要用cherry-pick了. 语法 git  cherry-pick commitid ...

  8. [题解](约数)BZOJ_1053_反素数

    三条引理:1.1~N中最大风反质数,就是1~N中约数个数最多的最小的一个 比较显然,是应该看出来的一条 2.1~N中任何数的不同因子都不会超过10个,且所有质因子的指数之和不超过30: 2*3*5*7 ...

  9. mysql状态查询

    在监控中,都是去探测这些状态数据,然后换算到时间刻度上,像zabbix. show status like 'uptime'; --查看select语句的执行数 show [global] statu ...

  10. C#基础之方法

    方法组成为: public void Fun(string name) { 代码块 } 1.方法的访问级别:修饰符,即上边的Public 2.返回类型:方法是否具有返回值,上边方法无返回值即为void ...