运行在VS2022,x86,Debug下
33. Qt信号与槽
- 实现原理:观察者模式,即当一个对象被修改时,就会主动通知依靠它的对象。
- 应用:对象间的通讯。
33.1. Qt实现信号与槽,代码如下。
- #include <QObject>
- #include <QDebug>
- //发送者
- class Sender : public QObject
- {
- Q_OBJECT //必须在类声明中包含这个宏
- signals: void signal(); //声明信号
- public:
- void sendSignal() //发射信号
- {
- emit signal(); //通过emit关键字发射信号
- }
- };
- // 接收者
- class Receiver : public QObject
- {
- Q_OBJECT
- public slots:
- void handleSignal() // 槽函数,处理信号
- {
- qDebug() << "Signal received";
- }
- };
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
-
- Sender sender;
- Receiver receiver;
- // 将信号与槽连接起来
- QObject::connect(&sender, &Sender::signal, &receiver, &Receiver::handleSignal);
- // 发射信号
- sender.sendSignal();
- return a.exec();
- }
- #include "main.moc"
复制代码 33.2. C++模拟实现信号与槽,代码如下。
通过将函数指针传递给另一个函数,该函数可以在需要时通过该指针调用相应的函数,实现回调的效果。
- using SlotType = void(*)(void*); //定义槽函数指针类型,参数是void*,接收任意类型的数据
- // 发送者
- class Sender
- {
- private:
- vector<SlotType> slots; //槽函数列表
- public:
- void connect(SlotType slot) //连接信号与槽
- {
- slots.emplace_back(slot); //将槽函数指针添加到槽列表中
- }
- void sendSignal(void* data) //发射信号
- {
- for (auto&& slot : slots)
- slot(data); //调用所有已连接的槽函数
- }
- };
- // 接收者
- class Receiver
- {
- public:
- static void handleSignal(void* data) //槽函数,处理信号
- {
- cout << "Signal received: " << *static_cast<int*>(data) << endl;
- }
- };
- int main() {
- Sender sender;
- //将信号与槽连接起来
- sender.connect(&Receiver::handleSignal);
- //发射信号
- int signalData = 42;
- sender.sendSignal(&signalData);
- return 0;
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |