Qt:信号与槽

信号与槽机制就是某个对象A发送一个信号Signal,然后某个接收这个信号的对象B就会执行某个动作,这个动作就是槽函数slot。

连接方式

使用QObject::connect()进行信号与槽的链接,不同形式的连接方式

  1. 通用的语法
cpp 复制代码
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *reciver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

使用这种参数形式的语法一般为:

cpp 复制代码
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
  1. 对于没有重载函数的信号与槽,可以使用下面这种参数的连接方式
cpp 复制代码
QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *reciver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)

如:

cpp 复制代码
connect(lineEdit, &QLineEdit::textChanged, this, &widget::on_textChanged);

对于最后一个参数Qt::ConnectionType type,缺省值为Qt::AutoConnection。这个参数表示了信号与槽之间的关联方式。

类型 关联方式
Qt::AutoConnection 如果sender和reciver在同一个线程,就使用Qt::DirectConnection方式;否则使用Qt::QueuedConnection方式,在信号发射时自动确定关联方式。
Qt::DirectConnection 信号被发射时槽函数立刻执行,槽函数与信号在同一个线程。
Qt::QueuedConnection 在事件循环回到接收者线程后执行槽函数,槽函数与信号在不同线程。
Qt::BlockingQueuedConnection 信号线程被阻塞直到槽函数执行完毕。当信号与槽函数在同一个线程使绝对不能使用这种方式,否则会造成死锁。

获取信号发送者

在槽函数中,可以使用QObject::sender()获取信号发射者的指针。如果知道信号发射者的类型,可以将指针投射为确定的类型,然后使用这个确定类的接口函数。

例如,在QSpinBoxvalueChanged(int)信号的槽函数中,可以获取发射者的指针,从而对信号发射者进行操作。

cpp 复制代码
QSpinBox *spinbox = qobject_cast<QSpinBox *>(sender());

自定义信号及其使用

cpp 复制代码
class QPersion : public QObject
{
	Q_OBJECT
private:
	int m_age = 10;
public:
	void incAge();
signals:
	void ageChanged(int value);  // 自定义信号
}

void QPersion::incAge(){
	++m_age;
	emit ageChanged(m_age);  // 发射信号
}
相关推荐
benchmark_cc38 分钟前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库43 分钟前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
Tairitsu_H1 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
泡海椒1 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
小智老师PMP1 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN1 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
_林枭_2 小时前
ZW3D二次开发_原生表单_如何设置表单左上角图标
qt·zw3d
江畔柳前堤2 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
Figo_Cheung3 小时前
Figo基于RNC理论的宇宙演化第七纪元猜想
开发语言·php
会周易的程序员3 小时前
5Draft(五帝)测试报告
服务器·c++·分布式·raft·共识算法·共识·算力服务器