本文旨在分享技术
在做qt开发项目中,难免会遇到这样问题。就是父类触发一个事件,需要发送到子类。
这个时候都知道使用信号槽,进行绑定事件,就可以。
假设一种情况
A是B的父窗口,B是C的父窗口,C是D的父窗口。
那么我想要将A的信息发送到D。
这个时候有一种做法。
就是说 先将A的信号和B的槽绑定。在B的槽函数中触发发送到C的信号。最后由C发送信号到D。
这种做法虽说可行,但是过于繁琐。
重点来了
如果说想要实现A能直接与D通信。
需要实现一个全局的单例类(AppEvent)。在A类定义信号(假设a的信号为 sSendTest),然后再appevent中定义公共信号(假设为sSendPubliceTest),将a的信号绑定到appevent的信号,然后将D绑定到appevent对应的槽函数
写法:
connect(this,&A::sSendTest,AppEvent::getInstance(),&AppEvent::sSendPublicTest); //A发送信号 写在A中
connect(AppEvent::getInstance(),&AppEvent::sSendPublicTest,this,&D::ReceiverTest); //D接收信号并做处理,写在D中
ok,完整代码如下。
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "appevent.h"
#include <QLabel>
#include <qdebug.h>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected slots:
void onBtnClicked();
signals:
void sSendTest();
};
class testwgt : public QLabel
{
Q_OBJECT
public:
explicit testwgt(QWidget *parent = nullptr)
{
connect(AppEvent::getInstance(),&AppEvent::sSendTest,this,&testwgt::ReceiverTest);
};
~testwgt(){};
protected slots:
void ReceiverTest()
{
qDebug()<<"23456";
};
signals:
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include <qdebug.h>
#include <QPushButton>
#include <QVBoxLayout>
#include "appevent.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->resize(800,600);
connect(this,&Widget::sSendTest,AppEvent::getInstance(),&AppEvent::sSendTest); //信号可以触发信号
testwgt *wgt=new testwgt(this);
wgt->setFixedSize(100,100);
wgt->setStyleSheet("background:green");
QPushButton *btn=new QPushButton(tr("Abc"),this);
connect(btn,&QPushButton::clicked,this,&Widget::onBtnClicked);
QVBoxLayout *mainLayout=new QVBoxLayout(this);
mainLayout->addWidget(btn);
mainLayout->addWidget(wgt);
mainLayout->setMargin(0);
this->setLayout(mainLayout);
}
Widget::~Widget()
{
}
void Widget::onBtnClicked()
{
emit sSendTest();
}
appevent.h
#ifndef APPEVENT_H
#define APPEVENT_H
#include <QObject>
#include <QMutex>
#include <QSharedPointer>
class AppEvent : public QObject
{
Q_OBJECT
public:
static AppEvent *getInstance();
private:
explicit AppEvent(QObject *parent = nullptr);
AppEvent& operator =(AppEvent&) = delete;
AppEvent(AppEvent&) = delete;
private:
static AppEvent *m_appEvent_ptr;
static QMutex m_mutex;
protected slots:
signals:
void sSendTest();
};
#endif // APPEVENT_H
appevent.cpp
#include "appevent.h"
#include <qdebug.h>
AppEvent *AppEvent::m_appEvent_ptr=nullptr;
QMutex AppEvent::m_mutex;
AppEvent *AppEvent::getInstance()
{
if (nullptr == m_appEvent_ptr){
m_mutex.lock();
if (nullptr == m_appEvent_ptr){
m_appEvent_ptr = new AppEvent;
}
m_mutex.unlock();
}
return m_appEvent_ptr;
}
AppEvent::AppEvent(QObject *parent) : QObject(parent)
{
}
每日一图