0
点赞
收藏
分享

微信扫一扫

QT 信号槽机制

潇湘落木life 2022-01-22 阅读 90

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 相同,只是信号线程阻塞直到槽返回。 如果接收者位于信号线程中,则不得使用此连接,否则应用程序将死锁。

举报

相关推荐

0 条评论