qt的信号和槽通信机制(当多个窗口之间来回通信[父窗口和子窗口])

本文旨在分享技术

在做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)
{
}

每日一图
在这里插入图片描述

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

加油吧,小杜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值