版本Qt5.9.8 (其他版本同样适用)
一、子窗口设计(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内的文本
}
标签:窗口,QT,void,发送,ui,child,传递数据,MainWindow
From: https://blog.csdn.net/2303_76814451/article/details/143418413