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

效果如下:

 

  • 11
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Qt信号传递机制被广泛应用于多层次之间的通信。Qt采用了一种基于事件的机制,用于将信号从一个传递到另一个。 在Qt信号和槽是用来实现之间通信的关键机制。一个可以定义一个信号,当特定的事件发生时,该信号就会被触发。其他的可以连接到这个信号,并在信号被触发时执行相应的槽函数。 Qt信号和槽机制支持多层次之间信号传递。例如,如果A定义了一个信号B和C可以连接到这个信号。当A发出信号时,B和C都会收到通知,并执行与信号关联的槽函数。 此外,Qt还支持将信号和槽连接到特定实例的方法。例如,如果有多个实例化的D,每个实例都有一个自己的信号。其他可以连接到特定实例的信号,并在该实例发出信号时进行响应。 Qt信号和槽机制使得多层次之间信号传递变得简单和灵活。它提供了一种松耦合的方式来实现之间的通信,使得修改一个不会影响其他的实现。这种机制在Qt应用程序被广泛应用,使得之间的通信更加方便和可维护。 ### 回答2: 在Qt多层次之间信号传递是通过信号和槽机制实现的。信号和槽是Qt一种用于对象间通信的机制,它实现了一种松耦合的方式,使得不同之间的通信更加灵活和可扩展。 在多层次之间,一个可以定义一个信号,而另一个可以定义一个槽函数。当某个事件发生时,发送信号会通过emit关键字发射(emit)信号,而注册了该信号的槽函数会自动被调用。 需要注意的是,在多层次之间进行信号传递时,需要保证信号和槽函数之间的函数签名一致,即参数个数和型需要匹配。这样才能确保信号发射时能够顺利调用到对应的槽函数。 Qt信号和槽机制是基于元对象系统实现的,通过MOC(元对象编译器)在运行时实现信号和槽的连接和调用。MOC会为每个包含信号和槽的生成一些辅助代码,以便在运行时进行信号和槽的连接。 通过信号和槽的机制,不同层次的之间可以方便地进行通信和交互,可以实现复杂的功能和逻辑。这种方式可以解耦不同层次的,使得代码更加模块化和可维护性更高。同时,信号和槽还支持多线程,可以实现跨线程的通信。 总结来说,Qt多层次之间信号传递是通过信号和槽机制实现的,通过定义信号和槽函数并使用emit关键字触发信号的方式进行通信。这种机制使得之间的通信更加灵活和可扩展,提高了代码的模块化和可维护性。 ### 回答3: Qt是一个流行的C++跨平台应用程序框架,它提供了一个灵活的信号和槽机制来实现多层次之间信号传递Qt信号和槽是一种事件驱动的通信机制,即当一个对象的状态发生变化时,它会发出一个信号,其他对象可以通过连接到该信号的槽函数来接收并处理这个信号。 在Qt,一个可以定义一个或多个信号,可以通过signals关键字声明。一个信号可以有任意数量和型的参数。另一方面,一个可以定义一个或多个槽函数,可以通过slots关键字声明。槽函数的参数列表必须与信号的参数列表匹配。 信号和槽的连接是使用connect函数来实现的。一个对象的信号可以连接到另一个对象的槽函数,以便在事件发生时调用槽函数进行处理。连接可以是直接连接,也可以是队列连接。直接连接表示信号发出后立即调用槽函数,队列连接表示信号被放入一个事件队列,在队列信号会在主事件循环被处理。 通过信号和槽的连接,Qt可以方便地进行多层次的事件处理和信号传递。一个可以发出一个信号,然后另一个连接到这个信号并接收它,进而再发出另一个信号,以此推,形成一个多层次信号传递链。 总而言之,Qt多层次之间信号传递可以通过信号和槽机制来实现。通过定义信号和槽函数,并使用connect函数进行连接,可以方便地在之间传递事件和数据。这种机制使得Qt应用程序的设计更加灵活和可扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值