Qt全局信号槽绑定和派发

参考了网友的改成的。

实现全局信号槽绑定和派发消息。在不同窗口之间传递消息,不带参数,需要的自己改成带参数的。

经过实际开发使用验证,证明是有效的,请放心使用。

头文件:

#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();
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XINGTECODE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值