参考了网友的改成的。
实现全局信号槽绑定和派发消息。在不同窗口之间传递消息,不带参数,需要的自己改成带参数的。
经过实际开发使用验证,证明是有效的,请放心使用。
头文件:
#pragma once
#include <qobject.h>
class MyobesrverApater;
struct relationData
{
QString type;
QObject *receiver;
MyobesrverApater *ob;
};
class MyobesrverApater : public QObject
{
Q_OBJECT
public:
explicit MyobesrverApater();
signals:
void notify();
};
class MyGlobalObserver : public QObject
{
Q_OBJECT
public:
static MyGlobalObserver* GetInstance();
static MyGlobalObserver *m_pInstance;
void attach(const QString & type, QObject * receiver, const char * method);
void detach(const QString &type, const QObject* reciver);
void notify(const QString & type);
private:
MyGlobalObserver();
~MyGlobalObserver();
private:
QList<relationData*> m_oRelationList;
};
CPP文件:
#include "module/myglobalobserver.h"
#include <QDebug>
MyobesrverApater::MyobesrverApater()
{
}
MyGlobalObserver* MyGlobalObserver::m_pInstance = nullptr;
MyGlobalObserver::MyGlobalObserver()
{
}
MyGlobalObserver::~MyGlobalObserver()
{
}
MyGlobalObserver* MyGlobalObserver::GetInstance()
{
if (m_pInstance == nullptr) {
m_pInstance = new MyGlobalObserver();
}
return m_pInstance;
}
//绑定消息
void MyGlobalObserver::attach(const QString& type, QObject* receiver, const char *method)
{
MyobesrverApater* oa = new MyobesrverApater();
connect(oa, SIGNAL(notify()), receiver, method);
relationData *data = new relationData();
data->type = type;
data->receiver = receiver;
data->ob = oa;
m_oRelationList.append(data);
}
//解除绑定
void MyGlobalObserver::detach(const QString & type, const QObject * receiver)
{
QList<relationData*>::iterator iter = m_oRelationList.begin();
while (iter != m_oRelationList.end())
{
if ((*iter)->type.compare(type) == 0 && (*iter)->receiver == receiver)
{
relationData *data = *iter;
m_oRelationList.removeOne((*iter));
delete data->ob;
delete data;
return;
}
iter++;
}
}
//发送消息
void MyGlobalObserver::notify(const QString & type)
{
QList<relationData*>::iterator iter = m_oRelationList.begin();
while (iter != m_oRelationList.end())
{
if ((*iter)->type.compare(type) == 0)
{
emit(*iter)->ob->notify();
}
iter++;
}
}
直接复制就可以用。
构造函数绑定,析构函数解除绑定。
使用样例:
//绑定
MyGlobalObserver::GetInstance()->attach(GlobalMessage::updateBumenList, this, SLOT(update_bumenlist()));
//解除绑定
MyGlobalObserver::GetInstance()->detach(GlobalMessage::updateBumenList, this);
实现函数:
void BuMenForm::update_bumenlist()
{
qDebug()<<“收到消息-部门列表-查询”;
getBumenDataFromCache();
}