近來做項(xiàng)目發(fā)現(xiàn),多個(gè)窗體之間要通信真的好麻煩,比如:A調(diào)出B,B調(diào)出C,那么C給A發(fā)消息,那就得經(jīng)過B轉(zhuǎn)發(fā)才能實(shí)現(xiàn)。對(duì)于兩三層窗體,這種方法還可以接受,但嵌套太多就有點(diǎn)煩人了。 基于這個(gè)原因,那么要實(shí)現(xiàn)的東西就很清楚了,有一個(gè)全局類,去直接綁定信號(hào)槽關(guān)系,在需要觸發(fā)的時(shí)候,通過這個(gè)全局類的函數(shù),去相應(yīng)的觸發(fā)一下,就可以實(shí)現(xiàn)直連通信了。12 globalObserver.h #ifndef GLOBALOBSERVER_H
#define GLOBALOBSERVER_H
#include <QObject>
#include "obesrverApater.h"
struct relationData
{
QString type;
QObject *reciver;
obesrverApater *obesrverApater;
};
class globalObserver : public QObject
{
Q_OBJECT
public:
//因?yàn)槭侨种挥幸粋€(gè),所以直接單例模式
static globalObserver* getGlobalObserver();
static void release();
static globalObserver *m_pInst;
//綁定
void attach(const QString type, QObject *reciver, const char *method);
//解綁
void detach(const QString type, const QObject* reciver);
//觸發(fā)
void notify(const QString type);
private:
explicit globalObserver(QObject *parent = 0);
~globalObserver();
private:
QList<relationData*> m_oRelationList;
};
#endif // GLOBALOBSERVER_H123456789101112131415161718192021222324252627282930313233343536
obesrverApater.h #ifndef OBESRVERAPATER_H
#define OBESRVERAPATER_H
#include <QObject>
class obesrverApater;
//工廠,方便構(gòu)造對(duì)象
class obesrverApaterFactory
{
public:
static obesrverApaterFactory *getInst();
static void realese();
static obesrverApaterFactory* inst;
obesrverApater* createObesrverApater();
private:
obesrverApaterFactory()
{}
};
//中間層,用來連接信號(hào)槽
class obesrverApater : public QObject
{
Q_OBJECT
public:
explicit obesrverApater(QObject *parent = 0);
signals:
void notify();
};
#endif // OBESRVERAPATER_H123456789101112131415161718192021222324252627282930313233
接下來就主要看看具體函數(shù)的實(shí)現(xiàn)了:
obesrverApater *obesrverApaterFactory::createObesrverApater()
{
return new obesrverApater();
}1234
void globalObserver::attach(const QString type, QObject *reciver, const char *method)
{
obesrverApater *oA = obesrverApaterFactory::getInst()->createObesrverApater();
connect(oA, SIGNAL(notify()), reciver, method);
relationData *data = new relationData();
data->type = type;
data->reciver = reciver;
data->obesrverApater = oA;
m_oRelationList.append(data);
}12345678910- 觀察者解綁函數(shù)實(shí)現(xiàn) void globalObserver::detach(const QString type, const QObject *reciver)
{
QList<relationData*>::iterator iter = m_oRelationList.begin();
while (iter != m_oRelationList.end())
{
if ((*iter)->type.compare(type) == 0 && (*iter)->reciver == reciver)
{
relationData *data = *iter;
m_oRelationList.removeOne((*iter));
delete data->obesrverApater;
delete data;
return;
}
iter++;
}
}123456789101112131415161718
void globalObserver::notify(const QString type)
{
QList<relationData*>::iterator iter = m_oRelationList.begin();
while (iter != m_oRelationList.end())
{
if ((*iter)->type.compare(type) == 0)
{
emit (*iter)->obesrverApater->notify();
}
iter++;
}
}123456789101112
globalObserver::~globalObserver()
{
//釋放列表數(shù)據(jù)
QList<relationData*>::iterator iter = m_oRelationList.begin();
while (iter != m_oRelationList.end())
{
delete (*iter)->obesrverApater;
delete *iter;
iter++;
}
}12345678910111213測(cè)試:
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
globalObserver::getGlobalObserver()->attach("haha", this, SLOT(haha()));
globalObserver::getGlobalObserver()->attach("hehe", this, SLOT(hehe()));
QPushButton *p = new QPushButton("haha", this);
connect(p, SIGNAL(clicked()), this, SLOT(onHaha()));
p->setGeometry(10, 10, 200, 40);
}
Widget::~Widget()
{
globalObserver::getGlobalObserver()->detach("haha", this);
globalObserver::getGlobalObserver()->detach("hehe", this);
}
void Widget::haha()
{
QMessageBox::about(this, "", "haha");
}
void Widget::hehe()
{
QMessageBox::about(this, "", "hehe");
}
void Widget::onHaha()
{
globalObserver::getGlobalObserver()->notify("haha");
}1234567891011121314151617181920212223242526272829303132
|
|
|