运行在VS2022,x86,Debug下
#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"
通过将函数指针传递给另一个函数,该函数可以在需要时通过该指针调用相应的函数,实现回调的效果。
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;
}
因篇幅问题不能全部显示,请点此查看更多更全内容