ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

QT 信号槽机制

2022-01-22 14:30:00  阅读:153  来源: 互联网

标签:sender Qt 函数 信号 函数指针 Lambda 机制 QT


QT信号-槽机制可以说是QT最为重要的机制了,也是QT最引以为豪的东西。
这个信号-槽机制可以让各个不同对象之间的数据传递更为的方便,非常的实用。

信号-槽的常见用法:

1.最为常用的形式

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

sender:   表示发送信号的对象
signal:     表示要发送的信号
receiver:  表示接收信号的对象
method:   表示接收信号的槽函数

2.信号的转发形式

connect(sender1,SIGNAL(signal1),sender2,SIGNAL(signal2));

sender1:  表示发送信号的对象
signal1:    表示要发送的信号
sender2:  表示要转发信号的对象
signal2:    表示要转送的信号

这种形式用到的地方不多,一般用在ui控件不影响当前窗口而去get数据或者是两个对象之间关联性较弱而又需要建立关联的情况
比如:QDialog窗口有个按钮需要点击获取数据,然后显示在窗口上,而获取数据的对象或者接口在mainwindow上。
这个时候就可以用到了,

connect(ui->pushbutton,SIGNAL(clicked()),this,SIGNAL(getDataSig()));


当然,这种形式还是需要QDialog写一个信号函数的,但不需要调用,也不需要在QDialog写槽函数,减少了部分代码量。

3.函数指针的方式

connect(sender,PointerToMemberFunction1,receiver,PointerToMemberFunction2);

sender: 表示发送信号的对象
PointerToMemberFunction1: 表示要发送的信号的函数指针
receiver: 表示接收信号的对象
PointerToMemberFunction2: 表示接收信号的槽函数的函数指针

函数指针通常是 &类名::函数名 比如: &QPushButton::clicked

注意:1.这里无需加括号和函数参数
      2.只有信号的参数至少与槽一样多,并且信号中相应参数的类型与槽之间存在隐式转换,槽可以连接到给定信号。

4.信号-槽跟Lambda连用

connect(sender,PointerToMemberFunction,this,[capture](parameters){
...
statement
...
});

sender: 表示发送信号的对象

PointerToMemberFunction1: 表示要发送的信号的函数指针

capture:捕捉列表。捕捉列表总是出现在Lambda函数的开始处。实际上,[]是Lambda引出符。编译器根据该引出符判断接下来的代码是否是Lambda函数。捕捉列表能够捕捉上下文中的变量以供Lambda函数使用;

parameters: 参数列表。与普通函数的参数列表一致。如果不需要参数传递,则可以连同括号“()”一起省略;

statement: 函数体。内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。当不想多写一个槽函数的情况下,可以这样使用。

信号和槽需要注意的点:
1.所有连接信号的槽的方式,信号和槽的参数都需要一一对应,同样数量的参数并能隐式转换
2.信号函数和槽函数所在的类必须继承自QObject,并且有对应的宏Q_Object
3.用Lambda的时候,信号必须要用函数指针的方式连接
4.QObject类型不能作为信号参数传递


关于信号-槽连接的第五个参数:
默认情况下,信号槽是以 Qt::AutoConnection 的方式连接的
在这种方式下,如果信号和槽在同一线程 则会以 Qt::DirectConnection方式连接,否则会以Qt::QueuedConnection 方式连接,连接方式会在信号发出时确定。


Qt::DirectConnection 方式:发出信号会立即调用槽函数,这种方式是阻塞的,也就是说线程会在执行完槽函数之后才会执行发出信号的下一行代码。


Qt::QueuedConnection 方式:发出信号后,并不会立即执行,而是会将信号加入队列,等待执行。这种方式数据会多拷贝一份,所以数据量大的话,时间也长一点。


Qt::BlockingQueuedConnection 方式:与 Qt::QueuedConnection 相同,只是信号线程阻塞直到槽返回。 如果接收者位于信号线程中,则不得使用此连接,否则应用程序将死锁。

标签:sender,Qt,函数,信号,函数指针,Lambda,机制,QT
来源: https://blog.csdn.net/qq_44424396/article/details/122636987

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有