QT信号槽的六个优点(虽然直接调用函数也可解决问题,但要在具体的函数中传递指针,多对一和解除关系也够麻烦的)
信号槽是Qt中特有的概念。它使得程序员将不同的object绑定起来,而object对象间并不需要对相互了解。 Slots也是普通的c++方法,它们可以是virtual;可以被重载;可以使private、protected、public,可以像其它c++方法一样有各种类型的参数,Signals则无这些属性。它们唯一的区别就是signal与slot是相互链接起来的,slot函数在每次signal函数被emit时会被调用。
声明信号,跟函数不一样,不需要定义
signals:
void mySignal();
void mySignal(int x);
void mySignalParam(int x,int y);
在用到的地方发送信号(先建立了信号与槽的连接,才能接受信号)
emit mySignal();
声明槽,slots有public等属性,槽就相当于定义的一个函数,在里面实现某些功能。
public slots:
void mySlot();
void mySlot(int x);
void mySlot(int x,int y);
连接信号signal和槽函数slot:
connect(sender, SIGNAL(mySignal()), receiver, SLOT(mySlot()));
sender和receiver是QObject对象的指针,signal和slot函数是不带参数的函数名,实际上SIGNAL()和SLOT()宏将他们的参数(signal和slot函数)转换成相应的字符串。
注意
1、一个信号可以连接到多个槽:
connect(sender, SIGNAL(mySignal(int)),receiver1, SLOT(mySlot(int)));
connect(sender, SIGNAL(mySignal(int),receiver2, SLOT(mySlot(int)));
当信号发出后,槽函数都会被调用,但是调用的顺序是随机的,不确定的。
2、多个信号可以连接到同一个槽
connect(sender1 SIGNAL(mySignal1()), receiver, SLOT(mySlot()));
connect(sender2, SIGNAL(mySignal2()),receiver, SLOT(mySlot()));
任何一个信号发出,槽函数都会执行。
3、一个信号可以和另一个信号相连
connect(sender, SIGNAL(mySignal1()),
this, SIGNAL(mySignal2()));
第一个信号发出后,第二个信号也同时发送。除此之外,信号与信号的连接和信号与槽连接相同。
4、连接可以被删除
disconnect(sender, SIGNAL(mySignal()),receiver, SLOT(mySlot()));
这个函数很少使用,因为当一个对象被删除后,Qt自动删除这个对象的所有连接。
5、参数设置
信号和槽函数必须有着相同的参数类型及顺序,这样信号和槽函数才能成功连接:
connect(sender, SIGNAL(mySignal(int, const QString &)),receiver, SLOT(mySlot(int, const QString &)));
如果信号里的参数个数多于槽函数的参数,多余的参数被忽略:
connect(sender, SIGNAL(mySignal(int, const QString &)),receiver, SLOT(mySlot(int)));
6、获得对象
QObject * QObject::sender () const [protected]
sender () 函数返回 信号发出者 的 QObject型指针。
对QObject型指针进行强制转换得到需要的。
在槽函数里使用得到信号发送对象。
例如:
mySlot(){
currentGlWidget = qobject_cast<GLWidget *>(sender());
QPushButton* btn= dynamic_cast<QPushButton*>(sender())
}
带返回值的信号槽
槽函数有返回值
可通过 value = emit mysignal() 得到返回值。
http://blog.csdn.net/zmy3376365/article/details/7590987
QT信号槽的六个优点(虽然直接调用函数也可解决问题,但要在具体的函数中传递指针,多对一和解除关系也够麻烦的)的更多相关文章
- Qt信号槽-原理分析
目录 一.问题 二.Moc 1.变量 2.Q_OBJECT展开后的函数声明 3.自定义信号 三.connect 四.信号触发 1.直连 2.队列连接 五.总结 六.推荐阅读 一.问题 学习Qt有一段时 ...
- Qt信号槽的一些事(第一次知道信号还有返回值,以及Qt::UniqueConnection)
注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...
- QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类
一般情况下信号槽直接连接方式不会出现问题,但是如果信号与槽在不同线程或Qt::QueuedConnection方式连接,可能会在连接期间报以下类似问题,如: QObject::connect: Can ...
- QT信号槽详解
1 QT信号槽详解 1.1 信号和槽的定义 信号是触发信号,例如按钮的点击触发一个clicked信号,槽是用来接收信号,并处理信号,相当于信号响应函数.一个信号可以关联多个槽函数,信 ...
- Qt信号槽的一些事 Qt::带返回值的信号发射方式
一般来说,我们发出信号使用emit这个关键字来操作,但是会发现,emit并不算一个调用,所以它没有返回值.那么如果我们发出这个信号想获取一个返回值怎么办呢? 两个办法:1.通过出参形式返回,引用或者指 ...
- Qt信号槽的一些事
注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...
- QT源码之Qt信号槽机制与事件机制的联系
QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容. 本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConne ...
- Qt信号槽源码剖析(一)
大家好,我是IT文艺男,来自一线大厂的一线程序员 大家在使用Qt开发程序时,都知道怎么使用Qt的信号槽,但是Qt信号槽是怎么工作的? 大部分人仍然不知道:也就是说大家只知道怎么使用,却不知道基于什么原 ...
- Qt信号槽源码剖析(二)
大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的基本概念.元对象编译器.示例代码以及Qt宏:今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频. Qt信号槽的宏 ...
随机推荐
- Visual Studio for Mac
Visual Studio for Mac 初体验 你喜爱的 IDE,现在可用于 Mac 来自:https://www.visualstudio.com/zh-hans/vs/visual-stu ...
- 自己动手编写一个VS插件(七)
作者:朱金灿 来源:http://blog.csdn.net/clever101 继续开发VS插件.今天在添加ATL控件时出现一个"未能返回新代码元素"的错误,如下图: 解决办法是 ...
- 让ProgressDialog在setCancelable(false)时按返回键可dismiss
最近发现Android4.0系统中ProgressDialog设置为setCancelable(true)时,点击ProgressDialog以外的区域也可以让ProgressDialog dismi ...
- WPF 从程序集中检索图片资源stream给Image控件使用
原文:WPF 从程序集中检索图片资源stream给Image控件使用 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/nihang1234/artic ...
- android模拟器上不了网的解决办法
Android模拟器默认的地址是10.0.2.3,默认的DNS也是10.0.2.3,对于在家里上网学习Android的人来讲,一般电脑的IP都是192.168.1.100之类的,不在同一个网段.所以就 ...
- JDK源代码学习系列03----StringBuffer+StringBuilder
JDK源代码学习系列03----StringBuffer+StringBuilder 因为前面学习了StringBuffer和StringBuilder的父类 ...
- ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 使用 EF 框架查询数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 使用 EF 框架查询数据 上一章节我们学习了如何设置 ...
- Android 百度定位SDK
原文:Android 百度定位SDK 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/shui1025701856/article/details/7 ...
- hdu 2037 这个夏天不AC (java)
问题: 这个题为项贪心算法.我们的想法是在第一时间每个周期根据结束排序(按结束越早穿越,更多的程序), 然后从第一个节目开始.假设下一个节目的开始时间大于一个节目的开始时间,是进行程序,依次递推. 输 ...
- 【Linux计划】XSI IPC
三种IPC这就是所谓的XSI IPC,每间: 消息队列 信号量 共享存储器 以下分别介绍三种IPC的使用方法. 1.消息队列 消息队列是消息的链接表,具有例如以下函数接口: msgget:创建一个新队 ...