C++,观察者模式,模拟Qt的信号和槽机制
运行在VS2022,x86,Debug下
33. 模拟Qt信号和槽机制
- 信号与槽实现原理:观察者模式,即当一个对象被修改时,就会自动通知依赖它的对象。
- 应用:对象间的通信。
- Qt实现信号与槽,代码如下。
#include
//发送者
class Sender : public QObject
{
Q_OBJECT //必须在类声明中包含这个宏
public:
signals: void signal(); //声明信号
void sendSignal() //发射信号
{
emit signal(); //通过emit关键字发射信号
}
};
// 接收者
class Receiver : public QObject
{
Q_OBJECT
public slots:
void handleSignal() // 槽函数,处理信号
{
qDebug() << "Signal received";
}
};
int main() {
Sender sender;
Receiver receiver;
// 将信号与槽连接起来
QObject::connect(&sender, &Sender::signal, &receiver, &Receiver::handleSignal);
// 发射信号
sender.sendSignal();
return 0;
}
- 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;
}