QT:子窗口设计(QDialog) + 子窗口向主窗口传递数据

版本Qt5.9.8   (其他版本同样适用)

目录

一、子窗口设计(QDialog)

(1)新建dialog子窗口文件

(2)ui和代码部分

(3)效果演示

二、子窗口向主窗口传递数据

(1)子窗口发送信号

(2)主窗口接收槽函数

(3)连接信号与槽

(4)效果演示

(5)tips

三、完整代码

一、子窗口设计(QDialog)

(1)新建dialog子窗口文件

        1.假设已经创建好了一个QT工程,名称为“ test ”。现在新建文件(新建子窗口所需文件)。

        2.新建Qt设计界面类文件,再选择Dialog(这里选的无按键对话框),这里命名为了child。

         3.如图所示:创建完成后会多出三个文件:子窗口的头文件、源文件、ui文件。

(2)ui和代码部分

        1.首先在主窗口的源文件(mainwindow.cpp)内加入子窗口头文件:

#include "child.h"

        2.在主窗口ui内添加一个用于打开子窗口的按钮,文本内容“打开子窗口”,按钮命名为“open”

        3.右键按钮控件,点击转到槽,选择clicked():

        4.槽函数内写入打开子窗口的代码:

void MainWindow::on_open_clicked()
{
    child child(this); //创建子窗口child(这里没有用指针)
    child.exec();  //以模态方式打开对话框(打开主窗口时不能使用主窗口)
}

(3)效果演示

       1. 点击按钮打开子窗口  2.子窗口打开期间无法操作主窗口

二、子窗口向主窗口传递数据

        要实现效果:在子窗口的lineEdit中输入数据点击并发送,会在主窗口的lineEdit中显示出来。

        传递数据主要有3步:子窗口发送信号 + 主窗口接收槽函数 + 连接信号与槽

(1)子窗口发送信号

        1.ui部分:子窗口ui内添加一个lineEdit控件用于输入数据。同时添加一个发送按钮

        2.子窗口头文件(child.h)添加signals:并定义信号:

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

        3.转到点击发送按钮时的槽函数,向槽函数内写入代码,实现发送信号:

void child::on_pushButton_clicked()//点击发送按钮
{
    emit sendData(ui->lineEdit->text()); //发送lineEdit内的文本
}

(2)主窗口接收槽函数

        1.ui部分:添加一个lineEdit用于显示子窗口发送过来的数据

        2.主窗口头文件(mainwindow.h)private slots中:定义接收函数:

private slots:

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

        3.主窗口源文件(mainwindow.cpp)内编写接收函数,实现显示:

void MainWindow::receiveData(QString data)//接收子窗口发送的数据
{
    ui->label->setText(data);//将接收数据设为lineEdit文本
}

(3)连接信号与槽

        在主窗口:点击“打开子窗口”按钮时的槽函数内连接信号与槽:

void MainWindow::on_open_clicked()
{
    child child(this); //创建子窗口child
    connect(&child, &child::sendData,this,&MainWindow::receiveData);//连接信号与槽
    child.exec();  //以模态方式打开对话框(打开主窗口时不能使用主窗口)
}

(4)效果演示

        子窗口输入内容点击发送后数据成功显示到主窗口(主窗口传数据子窗口设计方法同理)

(5)tips

         如果仅简单实现:子窗口操作后,让主窗口的变量值发生变化(比如子窗口输入完点击发送按钮,让主窗口定义的QSrting型变量a被赋值),需要:

        1.在主窗口头文件(mainwindow.h)private中:定义QSrting型变量a:

private:
    QString a;//存储接收到的信息

        2.主窗口接收函数修改为:

void MainWindow::receiveData(QString data)//接收子窗口发送的数据
{
    a = data;//接收数据赋值给a
    //qDebug() << "a:" << a; 可以qDebug一下检查(注意添加QDebug头文件)
}

三、完整代码

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_open_clicked();

    void receiveData(QString data);  //接收select发送的data信号,类型为QString

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "child.h"

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

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

void MainWindow::on_open_clicked()
{
    child child(this); //创建子窗口child
    connect(&child, &child::sendData,this,&MainWindow::receiveData);//连接信号与槽
    child.exec();  //以模态方式打开对话框(打开主窗口时不能使用主窗口)
}

void MainWindow::receiveData(QString data)//接收子窗口发送的数据
{
    ui->lineEdit->setText(data);//将接收数据设为lineEdit文本
}

child.cpp

#include "child.h"
#include "ui_child.h"

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

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

void child::on_pushButton_clicked()//点击发送按钮
{
    emit sendData(ui->lineEdit->text());//发送lineEdit内的文本
}