首页 > 其他分享 >QT:子窗口设计(QDialog) + 子窗口向主窗口传递数据

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

时间:2024-11-01 22:20:40浏览次数:3  
标签:窗口 QT void 发送 ui child 传递数据 MainWindow

版本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

相关文章

  • 一步到位!教你如何正确设置Tkinter窗口位置,拒绝闪现(怎么解决tkinter设置窗口位置总是在
    文章目录......
  • Pyqt搭建YOLOV5目标检测界面
    往期热门博客项目回顾:计算机视觉项目大集合改进的yolo目标检测-测距测速路径规划算法图像去雨去雾+目标检测+测距项目交通标志识别项目yolo系列-重磅yolov9界面-最新的yolo姿态识别-3d姿态识别深度学习小白学习路线yoloGUIOYQT界面YOLOv5-GUI是一款专为YOL......
  • 论阿里云NLB之于MQTT负载均衡的重要性
    论阿里云NLB之于MQTT负载均衡的重要性先看图首先看nginx下stream负载mqtt服务假设你有3个mqtt节点权重一致,假设节点1同时部署了nginx我们这里以c7cpu,4核8GB内存服务器为例。这时候,假设6万链接连进来,节点1要负载多少链接数?第1,是这6万进来的链接,6万;第2,自己消化1/3,2/3......
  • ESP8266 连接 MQTT 服务器EMQX 连接MQTTX
    目录1.先用有一台自己的云服务器2. 使用FinalShell连接阿里云云服务器ECS3.安装宝塔4.在云服务器打开8888端口5.使用外网面板地址打开宝塔面板6.安装Docker7.下载emqx8.打开emqxWeb界面9.下载MQTTX10.EMQX加一个客户端11.开始通信12.加入单片机ESP82661.先......
  • 项目实战:Qt+OpenCV仿射变换工具v1.1.0(支持打开图片、输出棋盘角点、调整偏移点、导出
    需求  1.打开图片;  2.矫正识别角点;  3.opencv摄像头操作子线程处理;  4.支持设置棋盘格的行列角点数; 背景  深入研究图像拼接细分支算法,产出的效果查看工具,验证算法单步思路。 相关博客  《项目实战:Qt+Opencv相机标定工具v1.3.0(支持打开摄像头、视......
  • Qt5.9使用QWebEngineView加载网页速度慢 ,卡顿,原因是默认开启了代理
     Qt5.9使用QWebEngineView加载网页速度慢,卡顿,原因是默认开启了代理https://blog.csdn.net/zhanglixin999/article/details/131161944 BUG单下的留言讲明了问题发生的原因,那就是系统默认设置为自动寻找代理,而使用代理后延迟会变得非常大。(1)关闭自动代理接的pro文件内添......
  • QT6 USB接收麦克声音并播放代码
    #include<QApplication>#include<QAudioSource>#include<QAudioSink>#include<QMediaDevices>#include<QAudioFormat>#include<QByteArray>#include<QIODevice>#include<QDebug>#include<QUdpSocket>#includ......
  • Qt 乱码问题和编码
    下是dbzhang关于qt中文乱码问题原因的阐述,觉得不错: 首先呢,声明一下,QString是不存在中文支持问题的,很多人遇到问题,并不是本身QString的问题,而是没有将自己希望的字符串正确赋给QString。很简单的问题,"我是中文"这样写的时候,它是传统的char类型的窄字符串,我们需要的只不过是......
  • Qt(文件IO)
    本章主要使用Qt配合UI实现文件IO的功能,编程目标是实现一个文件拷贝器。1.QFileDialog文件对话框(熟悉)与QMessageBox一样,QFileDialog继承了QDialog,是一个用于选择要打开或保存的文件(目录)的模态对话框。因此也使用静态成员函数进行弹窗,对话框的结果(选择的文件或目录的路径......
  • 【ROS2】在QtCreator中打开ROS工作目录
    1、准备1)在QtCreator中安装ROS插件(ros_qtc_plugin)2)在QtCreator中创建ROS2工程2、打开ROS2工作目录1)创建工程文件在ROS2工作目录(和src同级目录)中,创建工程文件,名为xxx.workspace,例如:laoer.workspace.2)添加文件内容<?xmlversion="1.0"?><Workspace>......