Qt中多层次类之间的信号传递简便方法

一、概述

为了解决Qt中多层次类之间,比如UI之间的信号传递,一般的方法是需要子类依次向父类传递,这样的传递需要经过中间类的多次转发,逻辑编写比较麻烦,针对这样的问题引入中间类做信号中转传递。如下图。

紫色路径:传统的层次转发,冗余。

红色路径:中间类转发,简洁。

二、实现方式

 引入的中间类需为为单列模式。

如下:

#ifndef TRANSMITSIGNALS_H
#define TRANSMITSIGNALS_H

#include <QObject>

class TransmitSignals : public QObject
{
    Q_OBJECT
public:
      static TransmitSignals &GetInstance();
private:
    TransmitSignals();
     ~TransmitSignals();

    TransmitSignals(const TransmitSignals &) = delete;
    TransmitSignals(const TransmitSignals &&) = delete;
    TransmitSignals &operator=(const TransmitSignals &) = delete;

signals:
    void mid_signal_1();
    void mid_signal_2(int state);
    void mid_signal_3();

public slots:


};

#endif // TRANSMITSIGNALS_H
#include "TransmitSignals.h"

TransmitSignals &TransmitSignals::GetInstance()
{
    static TransmitSignals RobotControl;
    return RobotControl;
}

TransmitSignals::TransmitSignals()
{

}

TransmitSignals::~TransmitSignals()
{

}

三、举例

现有三个UI类,MainWindow,Form,SubForm,分别模拟,(1)Form中的按钮往MainWindow发送信号,(2)SubForm中的checkBox往MainWindow发送信号。代码如下。

MainWindow代码。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "Form.h"

#include <QMainWindow>
#include <TransmitSignals.h>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void onSignal_1();
    void onSignal_2(int state);

    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    Form    mForm;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(&TransmitSignals::GetInstance(), SIGNAL(mid_signal_1()), \
            this, SLOT(onSignal_1()));
    connect(&TransmitSignals::GetInstance(),&TransmitSignals::mid_signal_2,\
            this,&MainWindow::onSignal_2);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onSignal_1()
{
    qDebug()<<"Form signal is received!";
}

void MainWindow::onSignal_2(int state)
{
    qDebug()<<"Subform state is :"<<state;
}

void MainWindow::on_pushButton_clicked()
{
    mForm.show();
}

Form代码

#ifndef FORM_H
#define FORM_H

#include "SubForm.h"

#include <QWidget>

namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT

public:
    explicit Form(QWidget *parent = nullptr);
    ~Form();

private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();

signals:
    void signal_1();
private:
    Ui::Form *ui;
    SubForm subForm;
};

#endif // FORM_H
#include "Form.h"
#include "TransmitSignals.h"
#include "ui_Form.h"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
    connect(this, SIGNAL(signal_1()),&TransmitSignals::GetInstance(),\
            SIGNAL(mid_signal_1()) );
}

Form::~Form()
{
    delete ui;
}

void Form::on_pushButton_clicked()
{
    emit signal_1();
}

void Form::on_pushButton_2_clicked()
{
    subForm.show();
}

SubForm代码

#ifndef SUBFORM_H
#define SUBFORM_H

#include <QWidget>

namespace Ui {
class SubForm;
}

class SubForm : public QWidget
{
    Q_OBJECT

public:
    explicit SubForm(QWidget *parent = nullptr);
    ~SubForm();
signals:
    void signal_2(int state);

private slots:
    void on_checkBox_stateChanged(int arg1);


private:
    Ui::SubForm *ui;
};

#endif // SUBFORM_H
#include "SubForm.h"
#include "ui_SubForm.h"
#include "TransmitSignals.h"

SubForm::SubForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SubForm)
{
    ui->setupUi(this);
    connect(this,&SubForm::signal_2,&TransmitSignals::GetInstance(),\
            &TransmitSignals::mid_signal_2);
}

SubForm::~SubForm()
{
    delete ui;
}

void SubForm::on_checkBox_stateChanged(int arg1)
{
    emit signal_2(arg1);
}

效果如下:

 

  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值