QT:主窗口与子窗口之间传递参数(信号与槽的方法)

 传递参数和多窗口设计后来发现有一个更简单的方法实现(用QDialog实现):传送门 

本文基于已有工程基础上进行QT:多窗口设计(主窗口点击按钮打开子窗口)

一、子窗口向主窗口传递信息

窗口UI界面设计:

主窗口包含一个LineEdit、一个pushButton按钮(用于打开子窗口,该按钮是之前已经设计好的)

子窗口包含一个LineEdit、一个pushButton按钮(用于发送信息到主窗口)

接下来根据信号与槽的机制,要实现子窗口向主窗口传递信息分为三步:

(1)子窗口发送信号 (2)主窗口接收信号的槽函数(3)连接子窗口信号与主窗口槽函数

---------------------------------------------------------------------------------------------------------------------------------

(1)子窗口发送信号 

1.在childwindow.h内加入一个新的信号:

signals:
    void sendData(QString data); //当点击发送时发送QString data信号

2.子窗口设计界面右键按钮后,点击转到槽、clicked()、再补充槽函数

void childwindow::on_pushButton_clicked() //点击发送按钮
{
    emit sendData(ui->lineEdit->text());  //把在lineEdit获取到的文本发送
}

(2)主窗口接收信号的槽函数

1.在mainwindow.h的private slots内声明信号接收的槽函数:

private slots:
    void receiveData(QString data);  //接收子窗口发送的data信号,类型为QString

2.在mainwindow.cpp内写好信号接收的槽函数:

void MainWindow::receiveData(QString data)
{
    ui->lineEdit->setText(data);    //将接收到的data信号设置为lineEdit的文本
}

(3)连接子窗口信号与主窗口槽函数

连接信号与槽的connect语法如下:

connect(sender, &SenderClass::signalName, receiver, &ReceiverClass::slotName);

connect(发送者, &发送者类::信号, 接收者, &接收者类::槽函数);

//连接信号与槽(子窗口发送消息到主窗口)   
connect(childwindow_ui, &childwindow::sendData,this,&MainWindow::receiveData); 

因为要在子窗口打开时建立连接,所以connect放在打开子窗口按钮的槽函数内,具体代码如下:

void MainWindow::on_pushButton_clicked()
{
    if(!childwindow_ui)
    {
        this->setEnabled(false);//禁用主窗口
        childwindow_ui = new childwindow(this);
        connect(childwindow_ui, &childwindow::closed,this,&MainWindow::childwindow_close); //连接主窗口close信号到主窗口槽函数
        //***********************放在这里**********************//
        connect(childwindow_ui, &childwindow::sendData,this,&MainWindow::receiveData);     //连接信号与槽(子窗口发送消息到主窗口)
        //****************************************************//
        childwindow_ui -> show();
    }
}

(4)效果演示

打开子窗口后,在子窗口输入文字再点击发送,信息会发送到主窗口并显示出来。

(5)完整代码

mainwindow.h代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "childwindow.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 on_pushButton_clicked() ;   //点击打开子窗口按钮的槽函数
    void childwindow_close()  ;      //关闭子窗口函数(关闭窗口时指针将置空)
    void receiveData(QString data);  //接收select发送的data信号,类型为QString

private:
    Ui::MainWindow *ui;
    childwindow    *childwindow_ui  = nullptr;
};
#endif // MAINWINDOW_H
childwindow.h代码

#ifndef CHILDWINDOW_H
#define CHILDWINDOW_H

#include <QMainWindow>
#include <QCloseEvent>

namespace Ui {
class childwindow;
}

class childwindow : public QMainWindow
{
    Q_OBJECT

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

signals:
    void closed(); // 当窗口关闭时发送的信号
    void sendData(QString chip); //当点击OK时发送的芯片型号信号********************************

protected:
    void closeEvent(QCloseEvent *event) override; // 重写closeEvent

private slots:
    void on_pushButton_clicked();

private:
    Ui::childwindow *ui;
};

#endif // CHILDWINDOW_H
mainwindow.cpp代码

#include "mainwindow.h"
#include "./ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

void MainWindow::on_pushButton_clicked()
{
    if(!childwindow_ui)
    {
        this->setEnabled(false);//禁用主窗口
        childwindow_ui = new childwindow(this);
        connect(childwindow_ui, &childwindow::closed,this,&MainWindow::childwindow_close); //连接主窗口close信号到主窗口槽函数
        connect(childwindow_ui, &childwindow::sendData,this,&MainWindow::receiveData);     //连接信号与槽(子窗口发送消息到主窗口)
        childwindow_ui -> show();
    }
}

void MainWindow::receiveData(QString data)
{
    ui->lineEdit->setText(data);    //将接收到的data信号设置为lineEdit的文本
}

void MainWindow::childwindow_close()//当子窗口关闭时,将指针置空并启用主窗口
{
    childwindow_ui = nullptr;
    this->setEnabled(true);
}
childwindow.cpp代码

#include "childwindow.h"
#include "ui_childwindow.h"

childwindow::childwindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::childwindow)
{
    ui->setupUi(this);
}

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

void childwindow::closeEvent(QCloseEvent *event)
{
    emit closed(); // 发射关闭信号
    QWidget::closeEvent(event); // 继续默认的关闭处理
}

void childwindow::on_pushButton_clicked() //点击发送按钮
{
    emit sendData(ui->lineEdit->text());  //把在lineEdit获取到的文本发送
}

二、主窗口向子窗口传递信息

根据信号与槽的机制同理可得,要反过来实现主窗口向子窗口传递信息,也分为三步: 

(1)主窗口发送信号 (2)子窗口接收信号的槽函数(3)连接主窗口信号与子窗口槽函数

这里原理一致,就不进行详细说明了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值