C++ Qt开发:自定义Dialog对话框组件

Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍自定义Dialog组件的常用方法及灵活运用。

在之前的文章中笔者已经为大家展示了默认Dialog组件的使用方法,虽然内置组件支持对数据的输入,但有时候我们需要一次性输入多个数据,此时如果之使用默认模态对话框似乎不太够用,此时我们需要自己创建一个自定义对话框,需要说明的是此类对话框也是一种窗体,所以可以在其上面放置任何通用组件,以实现更多复杂的开发需求。

自定义对话框需要解决的问题是,如何让父窗体与子窗体进行数据交换,要实现数据的交换有两种方式,第一种方式是通过动态加载模态对话框,当用户点击确定后通过GetValue()来拿到数据,而第二种方式则是通过发送信号的方式将数据投递给父窗体,这两种方式都可以,读者可根据自身需求来选择不同的通信方式。

1.1 使用模态对话框传值

首先我们需要创建一个自定义对话框,在Qt中创建对话框很容易,具体创建流程如下所示:

  • 选择项目 -> AddNew -> QT -> Qt设计师界面类 -> 选择DialogWithoutButtons -> 命名为Dialog保存

此时直接点击下一步按钮,并选中Forms/dialog.ui界面编辑菜单,在编辑栏中我们分别增加一个LineEdit编辑框,以及两个PushButton按钮组件,将第一个组件命名为BtnOk将第二个组件命名为BtnCancel,界面如下所示;

当做完页面布局后,其次我们还需要在Dialog.ui组件上增加两个信号,分别是点击关闭,并将信号关联到两个槽函数上,其信号应该写成如下图所示。

如上图,accept()QDialog 类的一个公共槽函数。调用这个槽函数会触发对话框的接受(accept)操作,通常用于模拟用户点击对话框的“确定”按钮。同样的reject() 也是 QDialog 类的一个公共槽函数。调用这个槽函数会触发对话框的拒绝(reject)操作,通常用于模拟用户点击对话框的“取消”按钮。

接着我们点开模态对话框的dialog.cpp对话框类,其类内需要定义两个成员函数,它们的功能如下:

  • 第一个 GetValue() 用来获取当前编辑框内的数据并将数据返回给父窗体。
  • 第二个 SetValue() 用来接收传入的参数,并将此参数设置到自身窗体中的编辑框内。
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);
}// 用于MainWindow获取编辑框中的数据
QString Dialog::GetValue()
{return ui->lineEdit->text();
}// 用于设置当前编辑框中的数据为MainWindow
void Dialog::SetValue(QString x)
{ui->lineEdit->setText(x);
}Dialog::~Dialog()
{delete ui;
}

接着我们来看一下MainWindow函数中是如何接收参数的,对于主窗体来说,当用户点击on_pushButton_clicked()按钮时,我们需要动态将自己创建的Dialog加载,读取出主窗体编辑框内的值并设置到子窗体内,当用户按下QDialog::Accepted时则是获取子窗体内的值,此时通过调用ptr->GetValue()子窗体的成员函数来返回一个字符串,并将其设置到父窗体的编辑框内,主函数代码如下所示;

// 首先要包含Dialog对话框类
#include "dialog.h"#include <iostream>
#include <QDialog>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);ui->lineEdit->setEnabled(false);ui->lineEdit->setText("hello lyshark");
}MainWindow::~MainWindow()
{delete ui;
}// 按钮点击后执行
void MainWindow::on_pushButton_clicked()
{// 创建模态对话框Dialog *ptr = new Dialog(this);                                 // 创建一个对话框Qt::WindowFlags flags = ptr->windowFlags();                     // 需要获取返回值ptr->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint);  // 设置对话框固定大小// 读取MainWindows参数并设置到DialogQString item = ui->lineEdit->text();ptr->SetValue(item);int ref = ptr->exec();             // 以模态方式显示对话框if (ref==QDialog::Accepted)        // OK键被按下,对话框关闭{// 当BtnOk被按下时,则设置对话框中的数据QString the_value = ptr->GetValue();std::cout << "value = " << the_value.toStdString().data() << std::endl;ui->lineEdit->setText(the_value);}// 删除释放对话框句柄delete ptr;
}

至此就实现了参数的子窗体传递到父窗体,如下图所示;

2.1 使用信号传值

对于信号传值,我们需要在dialog.h头文件中增加sendText()信号,以及on_pushButton_clicked()槽函数的声明部分,如下所示;

// 定义信号(信号只需声明无需实现)
signals:void sendText(QString str);
private slots:void on_pushButton_clicked();

而在dialog.cpp实现部分,我们首先需要将子窗体中的按钮组件绑定到onBtnClick()槽函数上面,当需要发送数据时直接通过调用emit sendText触发信号,并携带子窗体中send_data的数据;

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);// 连接pushButton到onBtnClick上connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onBtnClick()));
}Dialog::~Dialog()
{delete ui;
}// 发送信号到MainWindow
void Dialog::on_pushButton_clicked()
{QString send_data = ui->lineEdit->text();emit sendText(send_data);
}

接着是在mainwindow.h头文件定义中,新增槽函数receiveMsg()函数用来接收信号的传值。

private slots:// 定义槽函数void receiveMsg(QString str);void on_pushButton_clicked();

mainwindow.cpp实现部分,接收到信号后的槽函数receiveMsg其内部可以直接将参数设置到父类窗口的lineEdit组件上,而当on_pushButton_clicked按钮被点击是,我们只需要加载自己的子窗体,并Connect链接槽函数receiveMsg上面,当做完这一切之后,再通过subwindow->show()让子窗体显示出来。

#include "mainwindow.h"
#include "ui_mainwindow.h"#include "dialog.h"
#include <QDialog>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);ui->lineEdit->setEnabled(false);
}// 接收信号并设置到LineEdit上
void MainWindow::receiveMsg(QString str)
{ui->lineEdit->setText(str);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{Dialog *subwindow = new Dialog(this);// 当收到sendText信号时使用receiveMsg槽函数处理connect(subwindow, SIGNAL(sendText(QString)), this, SLOT(receiveMsg(QString)));subwindow->show();
}

当然,此类对话框是非模态的,读者可以拖动父对话框,而由于是信号控制,所以当发送参数到父窗体后,子窗体并不会立即关闭,如下图所示;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/228535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【上海大学数字逻辑实验报告】七、中规模元件及综合设计

一、实验目的 掌握中规模时序元件的测试。学会在Quartus II上设计序列发生器。 二、实验原理 74LS161是四位可预置数二进制加计数器&#xff0c;采用16引脚双列直插式封装的中规模集成电路&#xff0c;其外形如下图所示&#xff1a; 其各引脚功能为&#xff1a; 异步复位输…

在做题中学习(33):只出现一次的数字 II

137. 只出现一次的数字 II - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 1.首先想到出现三次的数&#xff0c;它们仨的任意一位都是相同的&#xff08;1/0&#xff09; 2.可以发现出现三次的数的某一位和a某一位在所有情况下%3最后的结果都和a的那一位相同&…

PMP项目管理 - 风险管理

系列文章目录 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 PMP项目管理 - 风险管理 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in…

Java技术栈 —— Log4j 2、Logpack、SLF4j日志框架介绍

Log4j 2、Logpack、SLF4j日志框架介绍 Log4j 2、Logpack、SLF4j日志框架&#xff0c;及其区别1.1 Log4j 21.1.1 日志级别1.1.2 日志输出目标位置1.1.3 日志刷新机制1.1.4 结构化打印日志1.1.5 异步打印日志1.1.6 在Cloud云环境汇集日志信息 1.2 LogPack1.3 SLF4j1.4 区别 Log4j…

从数据应用案例出发,探索2024年及未来的数据科学转型

如今&#xff0c;数据科学已经取得了长足的进步&#xff01;回顾数据科学的发展史&#xff0c;19世纪&#xff0c;人们使用基本统计模型收集、存储和处理数据。后来&#xff0c;当计算机进入万千家庭&#xff0c;数字时代正式到来&#xff0c;并由此产生了大量数据。互联网上数…

数据库——关系数据的规范化:范式判断【知识点罗列+例题讲解】

知识点罗列&#xff1a; 各种范式之间的关系 1.第一范式1NF&#xff1a; 如果关系模式R中所有的属性都具有原子性&#xff0c;均是不可再分的&#xff08;一个属性不能再被分解成更小的数据单元&#xff09;&#xff0c;则称R属于第一范式&#xff0c;简称1NF&#xff0c;记作R…

基于urllib库的网页数据爬取

实验名称&#xff1a; 基于urllib库的网页数据爬取 实验目的及要求&#xff1a; 【实验目的】 通过本实验了解和掌握urllib库。 【实验要求】 1. 使用urllib库爬取百度搜索页面。 2. 使用urllib库获取百度搜索的关键字搜索结果&#xff08;关键字任选&#xff09;。 实验原理及…

vite原理

一、依赖预构建 1、为什么需要依赖预构建 CommonJS和UMD兼容性 在开发阶段中&#xff0c;vite的开发服务器将所有的代码视为原生ES模块。因此&#xff0c;vite必须先将作为CommonJS或者UMD发布的依赖项转换为ESM。 这是vite的一个特色&#xff0c;也是为什么会相对于webpack比…

[足式机器人]Part4 南科大高等机器人控制课 Ch08 Rigid Body Dynamics

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 南科大高等机器人控制课 Ch08 Rigid Body Dynamics 1. Spatial Vecocity1.1 Spatial vs. Conventional Accel1.2 Plueker Coordinate System and…

C语言学习NO.-操作符(二)二进制相关的操作符,原码、反码、补码是什么,左移右移操作符、按位与,按位或,按位异或,按位取反

一、操作符的分类 操作符的分类 算术操作符&#xff1a; 、- 、* 、/ 、%移位操作符: << >>位操作符: & | ^ 赋值操作符: 、 、 - 、 * 、 / 、% 、<< 、>> 、& 、| 、^单⽬操作符&#xff1a; &#xff01;、、–、&、*、、-、~ 、siz…

Redis 数据类型和对象机制

一、Redis 简介 Redis 是&#xff08;key-value&#xff09;的 NoSQL 数据库&#xff0c;所有的 key 都是 String ,它的 value 可以是 String、hash、list、set、zset&#xff08;有序集合&#xff09;、Bitmaps&#xff08;位图&#xff09;、HyperLogLog、GEO(地理信息定位)…

汽车清除积碳和清洗节气门

汽车清除积碳和清洗节气门 汽车需要清除积碳的部位检查积碳方法&#xff1a; 清除积碳和清洗节气门风险&#xff1a;燃油宝 第一次清除积碳1万公里2万公里3万公里--5万公里6万公里以上 汽车需要清除积碳的部位 节气门喷油嘴进气道燃烧室 检查积碳方法&#xff1a; 建议每3到5…

烦躁的广告弹窗如何在 Edge 上消失?轻松招架 3 种方法

Edge问题解决教程之广告弹窗如何消失&#xff1f; 一、前言&#xff1a;广告弹窗问题二、使用Edge浏览器内置的广告拦截功能三、安装广告拦截浏览器扩展程序四、处理恶意软件和广告弹窗网站五、总结 一、前言&#xff1a;广告弹窗问题 Edge浏览器中出现的广告弹窗问题是由恶意…

verilog语法进阶,时钟原语

概述&#xff1a; 内容 1. 时钟缓冲 2. 输入时钟缓冲 3. ODDR2作为输出时钟缓冲 1. 输入时钟缓冲 BUFGP verilog c代码&#xff0c;clk作为触发器的边沿触发&#xff0c;会自动将clk综合成时钟信号。 module primitive1(input clk,input a,output reg y); always (posed…

ES6 面试题 | 02.精选 ES6 面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

计算机网络:DNS域名解析系统

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

DevOps常用工具全家桶,实现高效运维和交付

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理

任务书 软件名称 版本 ubuntu 18.04 64 位 Hadoop&#xff1a;hadoop-3.1.3.tar.gz 3.1.3 Jdk&#xff1a;jdk-8u212-linux-x64.tar.gz 1.8 Spark&#xff1a;spark-3.1.1-bin-hadoop3.2.tgz 3.1.1 Hive&#xff1a;apache-hive-3.1.2-bin.tar.gz 3.1.2 MySQL …

商家收款降低费率开户指南:微信支付0.2%费率(千分之二)开通步骤

在数字支付日益普及的今天&#xff0c;降低交易成本对商家而言至关重要。本文将引导您轻松开通微信支付0.2%的超低费率。 首先&#xff0c;让我们深入了解微信支付为不同商户类别提供的相关资质要求、费率标准以及资金结算的时间周期https://kf.qq.com/faq/220228IJb2UV220228u…

JWT知识

JWT概念 JWT组成 Java实现JWT Header String getHeader() {String header "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";String encodeBase64URLSafeString Base64.encodeBase64URLSafeString(header.getBytes(StandardCharset…