单例类在信号槽传输过程中应用场景-不同父窗口的子窗口,不同类对象的子对象。

单例类:即在程序运行的生命周期内,只有一个实例对象。其他地方创建的对象也是第一次创建的对象。

针对信号槽传输过程中存在的多层传输问题,A-D对象, 比较笨的方法就是 A-B-C-D,层层传输。

有了单例类,则可以直接A-单例类-D。

头文件:

#pragma once

#include 
#include 

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);

只需要在单例类中定义对应信号即可。两个不同的类直接通过这个单例类信号来中转。这样就省去了在不同对象直接的层层传输。

你可能感兴趣的:(QT,qt,c++,开发语言)