ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Qt实现信号与槽,模拟Qt的信号与槽,观察者模式
[打印本页]
作者:
铁佛
时间:
2024-6-11 11:09
标题:
Qt实现信号与槽,模拟Qt的信号与槽,观察者模式
运行在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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4