QT窗体间传值总结

2023-11-20

 在写程序时,难免会碰到多窗体之间进行传值的问题。依照自己的理解,我把多窗体传值的可以使用的方法归纳如下:

      1.使用QT中的Signal&Slot机制进行传值;

      2.使用全局变量;

      3.使用public形式的函数接口;

      4.使用QT中的Event机制(这种没有把握,但是感觉应该是可以的),但是实现起来应该比前几种复杂,这里不做讨论。

       下面分别进行讨论:

1.使用QT中的Signal&Slot机制进行传值:

      QT中的Signal&Slot机制相比于MFC中的消息机制简单了许多,它保证了任何对象之间均可以通过这种方式进行通信,甚至可以得到消息的sender。这里就拿一个简单的窗体间传值作为例子。

      首先看一下主窗体MainWindow:

      在设计器中拖拽一个Label和一个TextEdit控件到界面上,TextEdit用于显示传递过来的数据。

    创建一个右下有两个按键的对话框,放置一个Label和一个LineEdit。

     下面就是编码的操作了,我们需要在Dialog中声明一个信号,当用户点击OK时传递LineEdit中的内容到mainWindow中,具体的dialog.h代码为:

[cpp]  view plain copy
  1. #ifndef DIALOG_H  
  2. #define DIALOG_H  
  3.   
  4. #include <QDialog>  
  5.   
  6. namespace Ui {  
  7. class Dialog;  
  8. }  
  9.   
  10. class Dialog : public QDialog  
  11. {  
  12.     Q_OBJECT  
  13.       
  14. public:  
  15.     explicit Dialog(QWidget *parent = 0);  
  16.     ~Dialog();  
  17.       
  18. private:  
  19.     Ui::Dialog *ui;  
  20. signals:  
  21.     void  sendData(QString);  
  22. private slots:  
  23.     void on_buttonBox_accepted();  
  24. };  
  25.   
  26. #endif // DIALOG_H   
      其中的signals:void sendData(QString)便是我们需要的信号函数,同时声明了一个槽函数

       void on_buttonBox_accepted();用于相应确定按钮的click事件。下面就是需要在该函数中产生一个信号。代码如下:

[cpp]  view plain copy
  1. void Dialog::on_buttonBox_accepted()  
  2. {  
  3.     emit sendData(ui->lineEdit->text());  
  4. }  
      代码异乎寻常的简单,只需要用emit的方式调用sendData函数,将需要的参数传递进去即可。而MainWindow中则需要声明接收的槽函数,注意槽函数参数只能与信号函数少或相等,而不能多于信号函数参数个数。在MainWindow的头文件中声明槽函数:

[cpp]  view plain copy
  1. private slots:  
  2.     void receiveData(QString data);  

    为了便于测试,我只在MainWindow的构造函数中创建了一个Dialog对象,并连接了信号和槽,具体为:

[cpp]  view plain copy
  1. MainWindow::MainWindow(QWidget *parent) :  
  2.     QMainWindow(parent),  
  3.     ui(new Ui::MainWindow)  
  4. {  
  5.     ui->setupUi(this);  
  6.     //信号槽方式下父子窗体传值的测试  
  7.     Dialog *dlg = new Dialog;  
  8.     //关联信号和槽函数  
  9.     connect(dlg,SIGNAL(sendData(QString)),this,SLOT(receiveData(QString)));  
  10.    // dlg->setModal(true); 不论是模态或者非模态都可以正常传值  
  11.     dlg->show();  
  12. }  
      这里,我没有将父窗口的指针传递到Dialog中,如new Dialog(this),这种方式下,实际上可以归结到第三类传值方式中去。因为此时,可以使用MainWindow中的父窗口的函数进行数据的赋值和操作。

      这里,可能还有一个问题就是,父窗口如何给子窗口传值,一方面,仍然可以使用信号和槽的方式进行,但是,我感觉更便利的方式倒是使用这种public接口的方式进行传值。这种来的更直接和明显。当然,可以看出Signal&Signal方式进行此类的处理会更有通用性。

    在receiveData(QString)的槽函数中进行接收到数据的处理,这里仅仅进行了简单的显示:

[html]  view plain copy
  1. void MainWindow::receiveData(QString data)  
  2. {  
  3.     ui->textEdit->setText(data);  
  4. }  

    最后看下结果:

  

       最终的结果,因为信号和槽可以是多对多的,所以,在类似多个窗体广播信息时,这种方式就很有用,当然也可以使用全局变量的形式。

      


这里介绍另一种方式全局变量进行传值,在上一次的界面中的mainWindow和dialog中分别加入一个Label和LineEdit以及一个pushbutton。效果如:


       运行方式为在主界面mainWindow中单击全局变量按钮对全局变量进行赋值,赋值完成后,在Dialog中单击全局变量在LineEdit中显示全局变量的值,可以发现这种方式下可以很容易的反转传递内容。

        具体实现为:

       在mainWindow.cpp文件中加入:

[cpp]  view plain copy
  1. QString globaldata;         //声明一个全局变量用于窗体间传值  
      在全局传值按钮的clicked事件中对gloabaldata进行赋值:
[cpp]  view plain copy
  1. void MainWindow::on_globalpb_clicked()  
  2. {  
  3.     globaldata = ui->lineEdit->text();  
  4. }  
    在Dialog.cpp文件中声明外部变量:

[cpp]  view plain copy
  1. extern QString globaldata;  
    在全局传值按钮的clicked事件中对gloabaldata进行显示:

[cpp]  view plain copy
  1. void Dialog::on_pushButton_clicked()  
  2. {  
  3.     ui->lineEdit_2->setText(globaldata);  
  4. }  
         这种方式,可以看到一些缺点,就是不容易对UI界面进行实时显示,但是这对于一个系统来讲也有一些优势,就是可以方便地将一个系统的配置分配到相关的UI界面中去,但是,同样的,也增加了程序之间的耦合性。

      为了节省篇幅,这里不将最后的结果上传上来了, 下一博文,将介绍窗体间传值的另一种方式:public函数接口方式。


这里介绍另一种,使用public函数接口的方式,这里就牵扯到两个方向间的传值,父到子以及子到父窗口,通过这种方式都很容易做到,如子到父,可以在子窗体中实现一个public方法如prepareDoingData(&data),将需要处理的data的引用传递到子窗体,子窗体中可以对其进行操作,这里展示父到子的传值:

          在Dialog界面中增加一个TextEdit用于显示最终传递的内容,并增加一个公有的方法:

[cpp]  view plain copy
  1. public:  
  2.     void setTextEditData(QString data);  
  3. void Dialog::setTextEditData(QString data)  
  4. {  
  5.     ui->textEdit->setText(data);  
  6. }  

      上面部分是在头文件中的内容,下面为在.cpp中的内容,而在mainwindow.cpp中只需要进行调用即可:

[cpp]  view plain copy
  1. dlg->setTextEditData(QString("我来测试公有接口方式传值!"));  

最终的结果
        至此,三种传值的方式已经全部讲解完毕,具体在项目中国使用哪种方式进行传值,则要视具体情况而定。个人感觉,基本传值可以采用信号槽方式降低耦合,系统配置可以使用单例模式然后在各个界面中进行配置,而public接口方式则适用于父子间窗体传值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT窗体间传值总结 的相关文章

  • BLIP论文笔记

    BLIP Bootstrapping Language Image Pre training for Unified Vision Language Understanding and Generation Abstract 1 Intro
  • 在封装或使用el-dialog的时候无法获取到 $refs的坑

    经常使用 vue 的对element ui都不陌生 他的el dialog弹框组件为了性能的提升 第一次打开之前是不会渲染body内容的 这样子将会导致一个问题 我们无法获取到 dom 解决方法 方法一 因为源码是通过rendered 参数
  • 2021全国电设(F题)openmv的图像识别之数字识别

    基于openmv的图像识别 通过参加全国电子设计大赛F题总结出openmv4的数字识别 其它版本暂时没试过 欢迎交流 openmv简介 OpenMV是一个开源 低成本 功能强大的机器视觉模块 以STM32F427CPU为核心 集成了OV77
  • py214-基于Python+django的网购平台购物商城

    开发语言 Python python框架 django 软件版本 python3 7 python3 8 数据库 mysql 5 7或更高版本 数据库工具 Navicat11 开发软件 PyCharm vs code 前端框架 vue js
  • C++ 代码实现定义法计算行列式的值

    一 前言 最近在捣鼓C 学到线代的行列式之后就想着来捣鼓一下求行列式的值 主要原因是当时群里有人在捣鼓着用上下三角来求值 所以我最后就去玩定义法求值了 二 n阶行列式的定义 从定义中我们可以看出值计算公式由三个部分组成 分别是逆序数r 行列
  • C++基础知识 - 赋值构造函数

    赋值构造函数 如果没有定义赋值构造函数 编译器会自动定义 合成的赋值构造函数 与其他合成的构造函数 是 浅拷贝 又称为 位拷贝 定义 Human operator const Human other 实现 Human Human opera
  • MySQL数据库提示:Communications link failure,The last packet succe

    Last modified 2013 10 08 14 16 47 web网站使用MySQL数据库 今天突然报以下错误 Communications link failure The last packet successfully rec
  • html+css小名片代码

    作者 小刚 一位苦于信息安全的萌新小白帽 记得关注给个赞 谢谢 本实验仅用于信息防御教学 切勿用于其它用途 HTML css小名片效果 效果图 小名片代码 学习html css时做的小名片案例 效果图 鼠标移动到名片前 鼠标移动到名片后 小
  • STM32 电机教程 0 - MotorControl Workbench下载与安装

    前言 STM32微控制器提供了行业标准Arm Cortex M核心运行矢量控制或FOC模式的性能 广泛应用于空调 家用电器 无人机 建筑和工业自动化 医疗和电动自行车应用的高性能驱动器 STM32 MCSDK 电机控制软件开发工具包 固件
  • 扩散模型:Diffusion models as plug-and-play priors作为即插即用先验的扩散模型

    扩散模型 Diffusion models as plug and play priors作为即插即用先验的扩散模型 0 摘要 1 概述 2 方法 2 1 问题设置 2 2 将去噪扩散概率模型作为先验 3 实验 图像生成 3 1 MNIST
  • 搜狐畅游2018年9月15日校招真题(1)

    通过该道题目 题目描述如下 示例代码 include
  • mysql jdbc allow_mysql的jdbc.url携带allowMultiQueries=true参数的作用及其原理

    如下配置 jdbc url jdbc mysql 127 0 0 1 3306 chubb 2 autoReconnect true useUnicode true characterEncoding UTF 8 allowMultiQue
  • VMware 7.0

    在 vSphere 7 0 中 可以利用 vSphere Client HTML5 中提供的功能 基于 Flash 的 vSphere Web Client 已弃用且不再提供 VMware Host Client 是一个基于 Web 的应用
  • 纪录一下力扣28题越界的问题

    TOC 记录一下力扣28题用严蔚敏教材中的kmp求解出现的问题 ERROR42 不用怀疑数组越界了 贴上源码我们来分析一下 class Solution public void getNext vector
  • Canvas和SVG区别

    Canvas主要用笔刷来绘制2D图形 SVG主要用标签来绘制不规则矢量图 相同点 都是主要用来绘制2D图形 不同点 Canvas主要绘制位图 SVG主要绘制矢量图 不同点 SVG节点过多时渲染慢 Canvas性能更好一些 但写起来更复杂 不
  • 报错:Can‘t locate Win32/Console.pm in @INC (you may need to install the Win32::Console module)

    安装Open SSL中执行命令 perl Configure VC WIN32 no asm prefix C Dpan javaProject OpenSSL openssl 1 1 1b 出现以下错误 Can t locate Win3
  • Hi3516全系统类型烧录教程

    烧录资料下载 https gitee com hihope iot docs tree master HiSpark AI Camera Developer Kit Software tools 第一步 安装好hitool usb 烧写的驱
  • 鼠标右键添加git

    1 打开注册表 win R 输入regedit 2 找到HKEY CLASSES ROOT Directory Background目录 3 查看是否有shell这个目录 如果没有就添加 4 在shell目录下添加 项 鼠标右键点击新建 项
  • java-IO流(5)-IO流中的设计模式(装饰器模式和适配器模式)的介绍

    目录 1装饰器模式 1 1定义 1 2代码实现 1 3装饰器特点 1 4装饰器在IO流中的使用 2配适器模式 2 1Adapter适配器 2 2代码实例 2 3适配器特点 2 4适配器优缺点 2 5适配器在IO中的使用 3装饰器与适配器异同
  • C++中STL的string vector使用笔记

    文章目录 容器 STL使用的基本方式 常用容器的基本概念和使用 string容器的特性 string初始化 拼接 赋值 查找 初始化 赋值操作 取值操作 拼接操作 查找 string替换 比较 字串 插入和删除 替换 比较 截取子串 插入删

随机推荐

  • 对象池GenericObjectPoolConfig

    Apache commons pool本质上是 对象池 即通过一定的规则来维护对象集合的容器 commos pool在很多场景中 用来实现 连接池 任务worker池 等 大家常用的dbcp数据库连接池 也是基于commons pool实现
  • 互联网创业盈利模式指南

    看了很多创业的case 都有点下笔千言 离题万里的 情况 就是很多case都很精彩 但是公司 的价值最终是落实到 给创业者和投资人的回报的 因此 所有的case 最终都是 落实到盈利 模式上 一位投资人士说的很明确 中国的盈利模式很简单 就
  • 一、深度学习之anaconda以及Tensorflow的安装

    1 anaconda安装 在官网Free Download Anaconda下载anaconda5 2 Python3 6 按照下一步直到安装结束 注意 将两个选项都勾选上 将安装路径写入环境变量 2 安装Tensorflow 1 建立一个
  • 围棋吃子问题

    题目 Given a 2D board containing X and O capture all regions surrounded by X A region is captured by flipping all O s into
  • 浮生六记

    浮生六记 目录 浮生六记卷一 闺房记乐 002 浮生六记卷二 闲情记趣 015 浮生六记卷三 坎坷记愁 022 浮生六记卷四 浪游记快 034 浮生六记 2 浮生六记卷一 闺房记乐 余生乾隆癸未冬十一月二十有二日 正值太平盛世 且在 衣冠之
  • Android 性能优化系列:崩溃原因及捕获

    文章目录 崩溃的基本原因 抛出异常导致崩溃分析 AMS 如何承接应用的异常信息上报 对于 native crash 系统如何做处理 系统如何处理 ANR 异常数据 addErrorToDropBox DropBoxManager 在 Cra
  • 用简单易懂的话语来快速入门windows缓冲区溢出

    用简单易懂的话语来快速入门windows的缓冲区溢出教程 准备工具 immunity debugger https www immunityinc com products debugger WINDOWS的程序动态调试工具 Vulnser
  • matlab_多目标遗传算法

    前言 之前写过在python中的多目标遗传算法了 但是很可惜的是python调用商用有限元软件比较费事 需要在ironpython的编译环境下调用 然后这个ironpython它又是个老古董 不支持pandas和numpy这些python必
  • Transformer 模型详解

    本内容主要参照 此篇 然后结合个人理解新增和删减部分内容形成 文章目录 1 1 Transformer 概览 1 2 引入张量 1 3 Self Attention 自注意力 1 3 1 Self Attention 概览 1 3 2 Se
  • VirtualBox虚拟机网络连接设置的四种方式

    VirtualBox是一款SUN出品的非常优秀的虚拟机程序 版本也非常齐全 你可以在官网上找到适合各种操作系统平台的版本 这里我先给大家大致讲解下VBox的网络配置及应用 VirtualBox的提供了四种网络接入模式 它们分别是 1 NAT
  • mid360 SLAM 建图实现

    用别人分享的数据集试了下 室内建图问题不大 室外还不确定
  • Exynos4412 中断驱动开发(一)—— 中断基础及中断的注册过程

    一 中断基础概念 所谓中断 指CPU在执行程序的过程中 出现了某些突发事件即待处理 CPU必须暂停当前的程序 转去处理突发事件 处理完毕后CPU又返回原程序被中断的位置并继续执行 1 中断分类 a 内部中断和外部中断 根据中断的的来源 中断
  • (数据结构)树转换为二叉树、森林转换为二叉树、二叉树转换为树、二叉树转换为森林及树与森林的遍历

    1 树转换为二叉树 1 加线 在所有兄弟结点之间加一条线 2 去线 对树中每个结点 只保留它与第一个孩子结点的连线 删除它与其他孩子结点之间的连线 3 层次调整 以树的根结点为轴心 将整棵树顺时针旋转一定的角度 使之结构层次分明 注意第一个
  • 结束了在MSRA的实习

    从5月到11月底 总共在MSRA渡过了7个月的实习时光 这7个月似乎是我感觉过得最快的7个月 或许是一个人在北京 生活上没有太多的琐事 只有很单纯的工作 于是就有这种时光飞逝的感觉 当然 记忆里面也并非都是工作上的事情 在MSRA还认识来自
  • 通过External Tools在STM32CubeIDE下使用DAP-LINK

    目录 一 文章背景 二 准备工作 2 1 Stm32CubeIDE 2 2 DAP LINK 2 3 STM32目标板 三 配置过程 3 1 连接目标板 3 2 配置仿真器 3 3 更改调试设置为远程调试 3 4 新建OpenOcd扩展工具
  • 5种方法教你用Python玩转histogram直方图

    作者 xiaoyu 知乎 https zhuanlan zhihu com pypcfx 介绍 一个半路转行的数据挖掘工程师 直方图是一个可以快速展示数据概率分布的工具 直观易于理解 并深受数据爱好者的喜爱 大家平时可能见到最多就是 mat
  • 腾讯技术面经-后台-云计算虚拟化部门

    1 笔试 不区分 都是软开岗位 2个小时 一般1小时足够了 25道选择题 10道填空 还有2个选做题 涉及到操作系统 内存 HTTP协议 TCP UDP协议 LLR 0 LLR 1 数据结构 算法 C语言 协议 Ipv4
  • UE5学习笔记(一)——界面功能梳理&第一天知识点记录

    学习UE5的第一步 是软件安装 默认是安装好的 由于安装没有太多技术含量 所以就没有专门做记录 这里有个注意点 虚幻引擎是整合在Epic games launcher中的 也就是说开发引擎内嵌在游戏平台上 打个比方 就是如果你要下unity
  • SpringBoot项目拦截器过滤器配置

    1 我们在配置拦截器时需实现接口HandlerInterceptor package com example springbootdemo common conf interceptor import com example springb
  • QT窗体间传值总结

    在写程序时 难免会碰到多窗体之间进行传值的问题 依照自己的理解 我把多窗体传值的可以使用的方法归纳如下 1 使用QT中的Signal Slot机制进行传值 2 使用全局变量 3 使用public形式的函数接口 4 使用QT中的Event机制