QT的信号与槽机制是其核心特性之一,提供了一种强大的对象间通信方式,比传统的回调函数更加灵活和安全。
QObject
派生类可以发出的通知moc
(元对象编译器)自动生成emit
关键字触发QObject::connect(
sender, // 发送对象指针
SIGNAL(signalSignature), // 信号签名
receiver, // 接收对象指针
SLOT(slotSignature) // 槽签名
);
QObject::connect(
sender, // 发送对象指针
&SenderClass::signalName, // 信号成员函数指针
receiver, // 接收对象指针
&ReceiverClass::slotName // 槽成员函数指针
);
// 定义包含信号和槽的类
class MyClass : public QObject {
Q_OBJECT
public:
explicit MyClass(QObject *parent = nullptr);
signals:
void valueChanged(int newValue);
public slots:
void setValue(int value);
};
// 连接信号与槽
MyClass obj1, obj2;
QObject::connect(&obj1, SIGNAL(valueChanged(int)), &obj2, SLOT(setValue(int)));
// 触发信号
obj1.valueChanged(42); // 这将调用obj2.setValue(42)
// 连接
QObject::connect(&obj1, &MyClass::valueChanged, &obj2, &MyClass::setValue);
// 也可以使用lambda表达式
QObject::connect(&obj1, &MyClass::valueChanged, [](int value) {
qDebug() << "Value changed to:" << value;
});
QT提供了不同的连接类型:
Qt::AutoConnection // 默认(同线程直接连接,跨线程队列连接)
Qt::DirectConnection // 直接调用,在发送者线程执行
Qt::QueuedConnection // 异步,在接收者线程执行
Qt::BlockingQueuedConnection // 同步,在接收者线程执行并阻塞发送者线程
Qt::UniqueConnection // 唯一连接,防止重复连接
Q_OBJECT
宏qRegisterMetaType()
注册// 当signal1发出时,自动触发signal2
connect(obj1, &Class1::signal1, obj2, &Class2::signal2);
connect(button, &QPushButton::clicked, [=]() {
// 处理点击事件
});
// 当接收者被删除时自动断开
connect(sender, &Sender::signal, receiver, &Receiver::slot, Qt::UniqueConnection);
// 当接收者被删除时自动断开
connect(sender, &Sender::signal, receiver, &Receiver::slot, Qt::UniqueConnection);
信号与槽机制是QT框架中最强大和独特的特性之一,它极大地简化了对象间的通信,特别是在GUI编程中处理用户交互事件时。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有