Qt自定义全局信号槽
时间: 2023-08-19 15:03:49 浏览: 139
QT自定义信号和槽
4星 · 用户满意度95%
在Qt中,我们可以使用信号和槽(Signals and Slots)来实现对象间的通信。但是,如果我们需要在多个对象之间进行通信,那么就需要使用全局信号和槽。
Qt中并没有提供全局信号和槽的实现,但是我们可以通过自定义一个全局的信号槽类来实现该功能。下面是一个示例代码,演示了如何实现一个全局信号槽:
```
// GlobalSignalSlot.h
#ifndef GLOBALSIGNALSLOT_H
#define GLOBALSIGNALSLOT_H
#include <QObject>
class GlobalSignalSlot : public QObject
{
Q_OBJECT
public:
static GlobalSignalSlot* instance();
void emitGlobalSignal(int data);
signals:
void globalSignal(int data);
private:
static GlobalSignalSlot* m_instance;
explicit GlobalSignalSlot(QObject *parent = nullptr);
};
#endif // GLOBALSIGNALSLOT_H
```
```
// GlobalSignalSlot.cpp
#include "GlobalSignalSlot.h"
GlobalSignalSlot* GlobalSignalSlot::m_instance = nullptr;
GlobalSignalSlot* GlobalSignalSlot::instance()
{
if (!m_instance) {
m_instance = new GlobalSignalSlot();
}
return m_instance;
}
GlobalSignalSlot::GlobalSignalSlot(QObject *parent) : QObject(parent)
{
}
void GlobalSignalSlot::emitGlobalSignal(int data)
{
emit globalSignal(data);
}
```
使用该类可以实现在任何对象中连接到该全局信号。
```
auto globalSlot = GlobalSignalSlot::instance();
connect(globalSlot, &GlobalSignalSlot::globalSignal, this, [=](int data){
qDebug() << "Received global signal with data: " << data;
});
```
当我们需要发送全局信号时,只需要调用该类的emitGlobalSignal函数。
```
GlobalSignalSlot::instance()->emitGlobalSignal(100);
```
需要注意的是,由于全局信号槽是单例模式,所以我们需要保证只有一个实例存在。在该示例中,我们使用了静态变量和静态函数来实现单例模式。
阅读全文