Qt信号和槽

简介: Qt信号和槽

Qt信号和槽实际上就是23种设计模式中的观察者模式;当某个事件发生了就会发出信号,处理信号和自己的函数称为槽绑定来处理这个信号;信号的本质就是事件;

通过Qobject::connect函数连接信号和槽对应的对象,该函数是一个回调函数并被注册到Qt中;

信号和槽的优点:类型安全,松散耦合;一个类型若要支持信号和槽,则必须从QObject或QObject的子类继承,信号和槽机制不支持对模板的使用;

信号和槽机制增强了对象之间通信的灵活性,通常传递一个信号来调用槽函数会比直接调用非虚函数运行速度慢十倍左右,其原因:

       1)多线程的情况下,信号需要排队等待;

       2)编组和解组传递参数;

       3)安全的遍历所有关联;

       4)需要定位接受信号的对象;

Qt信号和槽第5个参数、

enum ConnectionType {
    AutoConnection,
    DirectConnection,
    QueuedConnection,
    BlockingQueuedConnection,
    UniqueConnection =  0x80
};

       1)自动连接(AutoConnection),默认的连接方式,如果信号与槽,也就是发送者与接受者在同一线程,等同于直接连接;如果发送者与接受者处在不同线程,等同于队列连接;

       2)直接连接(DirectConnection),当信号发射时,槽函数立即直接调用。无论槽函数所属对象在哪个线程,槽函数总在发送者所在线程执行,即槽函数和信号发送者在同一线程;

       3)队列连接(QueuedConnection),当控制权回到接受者所在线程的事件循环时,槽函数被调用。槽函数在接受者所在线程执行,即槽函数与信号接受者在同一线程;

       4)锁定队列连接(BlockingQueuedConnection),槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个;

       5)单一连接(UniqueConnection),这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接;

目录
相关文章
|
1月前
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
25 0
|
2月前
|
存储 安全 编译器
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
153 4
|
3月前
|
编译器 C++ 开发者
QT基础【7-跨进程发送信号】
QT基础【7-跨进程发送信号】
|
3月前
|
开发者
QT基础【6-跨界面发送信号】
QT基础【6-跨界面发送信号】
|
4月前
QT自定义信号,信号emit,信号参数注册
使用signals声明返回值是void在需要发送信号的地方使用emit 信号名字(参数)进行发送在需要链接的地方使用connect进行链接ct进行链接。
19 0
QT自定义信号,信号emit,信号参数注册
|
6月前
10 QT - 自定义信号和槽
10 QT - 自定义信号和槽
35 0
|
7月前
|
数据可视化 容器
Qt 之 QPushButton,信号与槽机制
Qt 之 QPushButton,信号与槽机制
96 0
|
1月前
|
安全 编译器 开发者
【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式
【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式
34 0
|
12天前
|
编译器 API
【Qt】- 信号和槽函数
【Qt】- 信号和槽函数
|
7月前
|
Linux 编译器 C++
linux系统中QT里面信号与槽的实现方法
linux系统中QT里面信号与槽的实现方法
47 0