QT信号槽连接方式

1.QT信号槽主要分两个连接方式,手动和自动:

1.1 使用 connect() 函数手动连接信号和槽:

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

自动:

1.2 使用 lambda 表达式连接信号和槽:

connect(sender, &Sender::signal, ={

receiver->slot();

});

1.3 通过使用 QMetaObject::connectSlotsByName() 函数自动将部件中以 on_ 开头命名的槽函数与其对应的信号相连接。例如,在设计窗口中选择一个按钮,并在属性编辑器中设置其 objectName 属性为 "myButton",然后定义一个 on_myButton_clicked() 槽函数,该函数将自动连接到该按钮的 clicked() 信号上。

2.connect()函数的五种连接方式,一次连接,终身调用,除非disconnect。

复制代码
enum ConnectionType {
	AutoConnection,//默认
	DirectConnection,//立即调用
	QueuedConnection,//放在接收者队列
	BlockingQueuedConnection,//与放在接收者队列,同时阻塞发送者
	UniqueConnection =  0x80//标志位,避免重复链接
};

connect()函数原型如下:

复制代码
[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

2.1 Qt::AutoConnection(默认)

根据 sender 和 receiver 两者所在线程,当信号发出时作出判断。同一线程则 Qt::DirectConnection 连接,否则使用 Qt::QueuedConnection 连接。容易产生误区的点:不是sender的所属线程,而是真正触发了emit 信号的动作线程。

Qt::DirectConnection

无论sender和receiver是否在同一线程,都会立刻调用槽函数,最简单的理解成把一段代码"临时插入"到了运行栈,所以在多线程情况下非常危险,必须做好线程同步。

Qt::QueuedConnection

sender的信号会被压入到接收者的事件循环中,所以不会立即调用。而是等到当接收者对象处理其自身的消息队列时,再针对消息队列中的这个信号进行处理。可以说就是为了开发者解决跨线程通信而设计的。当然你也可以用于同一个线程不同对象,这种相同线程的强行指定队列方式通常都会和GUI的模态窗有关。

Qt::BlockingQueuedConnection

Blocking+QueuedConnection,他的槽函数运行时机与QueuedConnection是一致的。那Blocking的意义是什么?就是阻塞发送者!直到槽函数运行完毕再继续执行。源码上相比QueuedConnection的实现多加了一个等待输入的信号量QSemaphore,所以一旦接收者和发送者在同一线程,那就会发生死锁。

Qt::UniqueConnection

这个其实严格上来说相比上面四种方式并不算新的连接方式,而是用于修饰上面的四种连接方式。他实现的效果就是避免重复连接,因为Qt的信号槽是可以同一个信号和槽函数重复多次连接。这种通常都会是只执行一次就好,那就通过这个标志位进行修饰,达到多次连接(实际上也只是连接了一次)也只调用一次槽函数的效果。用(Qt::ConnectionType|Qt::UniqueConnection)来修饰。

复制代码
connect(ui->btn_close, &QPushButton::clicked, this, &QWidget::close,Qt::DirectConnection|Qt::UniqueConnection)
相关推荐
火山引擎开发者社区18 小时前
技术速递|使用 GitHub Copilot CLI 构建 Emoji 列表生成器
人工智能
王老师青少年编程18 小时前
信奥赛C++提高组csp-s之搜索进阶(搜索剪枝案例实践1)
c++·csp·高频考点·信奥赛·提高组·搜索剪枝·小木棍
codefan※18 小时前
干掉“幻觉“实战:如何构建企业级知识图谱增强 RAG
人工智能·知识图谱
wukangjupingbb19 小时前
传统基于药物 SMILES 序列和蛋白质氨基酸序列的 DTI(Drug-Target Interaction)预测方法的缺陷
人工智能
沪漂阿龙19 小时前
Codex 额度重置周期变化:AI 编程免费试玩时代正在结束
人工智能
TickDB19 小时前
美股行情 API 接入避坑:REST 快照、WebSocket 推送、盘前盘后数据的边界
人工智能·python·websocket·行情数据 api
装不满的克莱因瓶19 小时前
深入理解卷积神经网络(CNN)——从原理到代码实践
人工智能·神经网络·cnn
jingshaoqi_ccc19 小时前
windows 10系统下QT的安装及在Visual studio中的扩展安装
windows·qt·visual studio
完成大叔19 小时前
模块二,Agent知识图谱的工具链思考
人工智能
lauo19 小时前
ibbot手机发布:搭载poplang技术 + token节点经济,革新AI手机体验
人工智能·智能手机