单例类:即在程序运行的生命周期内,只有一个实例对象。其他地方创建的对象也是第一次创建的对象。
针对信号槽传输过程中存在的多层传输问题,A-D对象, 比较笨的方法就是 A-B-C-D,层层传输。
有了单例类,则可以直接A-单例类-D。
头文件:
#pragma once
#include <QObject>
#include <QVariant>
class qcTransSigSlot : public QObject
{
Q_OBJECT
public:
static qcTransSigSlot* GetInstance();
static void Release();//释放
static qcTransSigSlot* signalInstance;
Q_SIGNALS:
//当按复位按钮时,发送信号出来
void signalResetStatus();
//发送错误信息到报警窗口
void signalErrorInfo(QVariant var);
void signalReadGProgFile();
void signalReadGProgFileRes();
private:
qcTransSigSlot();
};
cpp文件
#include "qcTransSigSlot.h"
qcTransSigSlot* qcTransSigSlot::signalInstance = nullptr;//初始化对象
qcTransSigSlot::qcTransSigSlot()
{
}
//qcTransSigSlot::~qcTransSigSlot()
//{
//}
qcTransSigSlot* qcTransSigSlot::GetInstance()
{
//获得单例对象
if (signalInstance==nullptr)
{
signalInstance = new qcTransSigSlot();
}
return signalInstance;
}
//释放单例对象
void qcTransSigSlot::Release()//释放
{
if (signalInstance)
{
delete signalInstance;
signalInstance = nullptr;
}
}
在程序的头文件中定义一个宏:将获取实例对象定义为宏
//将单例类对象定义为宏
#define PTRANS_SIGNAL qcTransSigSlot::GetInstance()
在其他需要用到该对象的地方包含该头文件即可:
cpp1文件:
//中转信号
connect(PTRANS_SIGNAL, &qcTransSigSlot::signalReadGProgFile,
m_pSqlRW, &qcSqlReadWrite::slotReadGCodeFile);
connect(m_pSqlRW, &qcSqlReadWrite::signalReadGProgFileRes,
PTRANS_SIGNAL, &qcTransSigSlot::signalReadGProgFileRes);
cpp2中
connect(this, &qcGCodeToBuff::signalReadGProgFile,
PTRANS_SIGNAL, &qcTransSigSlot::signalReadGProgFile);
connect(PTRANS_SIGNAL, &qcTransSigSlot::signalReadGProgFileRes,
this, &qcGCodeToBuff::slotReadGProgFileRes);
只需要在单例类中定义对应信号即可。两个不同的类直接通过这个单例类信号来中转。这样就省去了在不同对象直接的层层传输。