【Qt】对话框QDialog

文章目录

  • **对话框**QDialog
    • **基本概念**
    • 对话框分类
    • 标准对话框
    • 自定义消息框
      • 模态对话框
      • 非模态对话框
    • 案例:点击新建按钮弹出对话框
    • 消息对话框
    • 其它标准对话框

对话框QDialog

基本概念

对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互


Qt 中使用QDialog类实现对话框,像主窗口一样,我们通常会设计一个类继承QDialog:

QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。

  • 顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置

对话框分类

对话框分为模态对话框和非模态对话框

  • 模态对话框:会阻塞同一应用程序中其它窗口的输入。比如:“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的
  • 非模态对话框:创建对话框后可以对其他窗口进行操作。例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑

标准对话框

标准对话框,是 Qt 内置的一系列对话框,比如有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等

Qt 的内置对话框大致分为以下几类:

  • Q C o l o r D i a l o g QColorDialog QColorDialog: 选择颜色
  • Q F i l e D i a l o g QFileDialog QFileDialog: 选择文件或者目录
  • Q F o n t D i a l o g QFontDialog QFontDialog: 选择字体
  • Q I n p u t D i a l o g QInputDialog QInputDialog: 允许用户输入一个值,并将其值返回
  • Q M e s s a g e B o x QMessageBox QMessageBox: 模态对话框,用于显示信息、询问问题等
  • Q P a g e S e t u p D i a l o g QPageSetupDialog QPageSetupDialog: 为打印机提供纸张相关的选项
  • Q P r i n t D i a l o g QPrintDialog QPrintDialog: 打印机配置
  • Q P r i n t P r e v i e w D i a l o g QPrintPreviewDialog QPrintPreviewDialog:打印预览
  • Q P r o g r e s s D i a l o g QProgressDialog QProgressDialog: 显示操作过程

自定义消息框

Qt 支持模态对话框和非模态对话框:

  • 使用 Q D i a l o g : : e x e c ( ) QDialog::exec() QDialog::exec()实现应用程序级别的模态对话框
  • 使用 Q D i a l o g : : o p e n ( ) QDialog::open() QDialog::open()实现窗口级别的模态对话框
  • 使用 Q D i a l o g : : s h o w ( ) QDialog::show() QDialog::show()实现非模态对话框

模态对话框

应用程序级别的模态 => 默认的方式

当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口

窗口级别的模态

该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。窗口级别的模态尤其适用于多窗口模式


例子:

QDialog dialog;
dialog.setWindowTitle(tr("Hello, dialog!"));
dialog.exec();

调用了exec()将对话框显示出来,当对话框出现时,我们不能与主窗口进行任何交互,直到我们关闭了该对话框,这是一个模态对话框


非模态对话框

QDialog dialog(this);
dialog.setWindowTitle(tr("Hello, dialog!"));
dialog.show();//将exec()修改为show()

现象:对话框竟然一闪而过,因为show()函数不会阻塞当前线程,对话框会显示出来,然后函数立即返回,代码继续执行

注意:此时dialog 是建立在栈上的,dialog 超出作用域被析构,因此对话框消失了,将 dialog 改成堆上建立,当然就没有这个问题了

QDialog *dialog = new QDialog(this);
dialog->setWindowTitle(tr("Hello, dialog!"));
dialog->show();

此时仍有一个问题:此时是将对话框设置到对象树上,但是如果对内存占用有严格限制的话,当我们将主窗口作为 parent 时,主窗口不关闭,对话框就不会被销毁,所以会一直占用内存

解决办法:setAttribute()函数设置对话框关闭时,自动销毁对话框。

dialog->setAttribute(Qt::WA_DeleteOnClose);

案例:点击新建按钮弹出对话框

ui界面如下

image-20231004193213355

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//案例:点击新建按钮=>弹出对话框connect(ui->actionNew,&QAction::triggered,[=](){//case1:创建模态对话框/*QDialog dlg(this);dlg.resize(200,100);//调整对话框大小dlg.exec();//阻塞 此时不可以对其它窗口进行操作qDebug() <<"模态对话框弹出";//关闭了对话框才会输出这句话*///case2:创建非模态对话框QDialog* dlg = new QDialog(this);dlg->resize(100,200);dlg->show();dlg->setAttribute(Qt::WA_DeleteOnClose);qDebug() <<"非模态对话框弹出";});
}

注意:为什么窗口模态对话框的时候,QDialog对象在栈上创建,而创建非模态对话框的时候在堆上创建?

  • 因为模态对话框会阻塞当前其它窗口操作,只有当前对话框关闭了才能操作其它窗口,所以该局部变量在对话框关闭前始终有效
  • 而非模态对话框不会阻塞当前其它窗口操作,如果dialog对象是建立在栈上的,dialog 超出作用域被析构,因此对话框消失了,所以要将 dialog 改成堆上建立

创建非模态对话框细节处:因为当前这个对象是new出来的,交给对象树,该对象在窗口关闭的时候才会释放,如果有人不断的点击新建按钮,然后又关闭,每次都会创建一个新对象,可能导致内存泄漏,所以需要设置55号属性 Q t : : W A D e l e t e O n C l o s e Qt::WA_DeleteOnClose Qt::WADeleteOnClose =>在关闭对话框的时候就把对象释放掉


消息对话框

使用上述点击新建按钮,触发不同的反应:

错误对话框 =>本质是 模态对话框

QMessageBox::critical(this,"critical","错误");

image-20231004194037552

消息对话框

 QMessageBox::information(this,"info","信息");

image-20231004194127789

提问对话框

//参数1:父亲指针  参数2:对话框的标题  参数3:提示内容  参数4:关联的按键类型=>使用|运算指定对话框应该出现的按钮
//参数5:指定默认选择的按钮
if (QMessageBox::Save  ==  QMessageBox::question(this,"ques","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
{//该函数的返回值就是按键类型qDebug() << "选择的是保存";}
else
{qDebug() << "选择的是取消";
}

image-20231004194302336


警告对话框

QMessageBox::warning(this,"warning","警告");

image-20231004194341839


其它标准对话框

颜色对话框

QColor color =  QColorDialog::getColor(QColor(255,0,0));
qDebug() << "r = " << color.red() << " g = " << color.green() << " b  = " << color.blue() ;//输出选择颜色的RGB

image-20231004194459806


文件对话框

//文件对话框  参数 1:父亲指针  参数2:标题   参数3:默认打开路径  参数4:需要过滤文件格式,只要该格式的文件 =>该参数可以省略
//返回值是 选取的文件的路径
QString str = QFileDialog::getOpenFileName(this,"打开文件","Z:","(*.txt)");
qDebug() << str;

image-20231004194713815


字体对话框

bool flag;
QFont font = QFontDialog::getFont(&flag,QFont("华文彩云",36)); //默认设置字体为华文彩云 36号字体
//QString转为char*的方法:  toUtf8().data()
qDebug() << "字体:" << font.family().toUtf8().data() << " 字号 "<< font.pointSize() << " 是否加粗"<< font.bold() << " 是否倾斜"<<font.italic();

image-20231004194805323


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

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

相关文章

【uniapp微信小程序+springBoot(binarywang)

uniapp前端代码 <template><view><page-head :title"title"></page-head><view class"uni-padding-wrap"><view style"background:#FFF; padding:50rpx 0;"><view class"uni-hello-text uni-cente…

pycharm2020无法打开,点击无反应

pycharm 2020 无法打开&#xff0c;点击无反应&#xff0c;今天我碰到这现象&#xff0c;总结大体原因 C:\Users\ygw\AppData\Roaming\JetBrains &#xff08;删除该目录即可&#xff0c;一般由于升级安装 或 安装两个不同版本 会存在老旧文件影响导致&#xff09;

SpringSecurity + jwt + vue2 实现权限管理 , 前端Cookie.set() 设置jwt token无效问题(已解决)

问题描述 今天也是日常写程序的一天 , 还是那个熟悉的IDEA , 还是那个熟悉的Chrome浏览器 , 还是那个熟悉的网站 , 当我准备登录系统进行登录的时候 , 发现会直接重定向到登录页 , 后端也没有报错 , 前端也没有报错 , 于是我得脸上又多了一张痛苦面具 , 紧接着在前端疯狂debug…

dpdk/spdk/网络协议栈/存储/网关开发/网络安全/虚拟化/ 0vS/TRex/dpvs技术专家成长体系教程

课程围绕安全&#xff0c;网络&#xff0c;存储&#xff0c;云原生4个维度去讲解核心技术点。 6个专栏组成&#xff1a;dpdk网络专栏、存储技术专栏、安全与网关开发专栏、虚拟化与云原生专栏、测试工具专栏、性能测试专栏 一、dpdk网络 dpdk基础知识 多队列网卡&#xff0…

JavaScript学习笔记(一)

1、JavaScript是什么&#xff1f; 是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言 2、JavaScript的组成是什么&#xff1f; ECMAScript&#xff08;基础语法&#xff09;、WebAPIS&#xff08;DOM、BOM&#xff09; 3、JavaScript书写位置有哪些&#xff1f;…

采集EtherNET/IP转Profinet在西门子plc中的应用

远创智控网关YC-EIPM-PN&#xff0c;让你的设备和云平台实时连接&#xff01; 远创智控YC-EIPM-PN网关产品支持各种数据接口&#xff0c;无论是工业领域的仪表、PLC、计量设备&#xff0c;还是设备数据&#xff0c;都能实时采集并整合。它将这些设备中的运行数据、状态数据等信…

学习pytorch13 神经网络-搭建小实战Sequential的使用

神经网络-搭建小实战&Sequential的使用 官网模型结构根据模型结构和数据的输入shape&#xff0c;计算用在模型中的超参数coderunning log网络结构可视化 B站小土堆pytorch视频学习 官网 https://pytorch.org/docs/stable/generated/torch.nn.Sequential.html#torch.nn.Se…

布朗大学发现GPT-4存在新问题,可通过非常见语言绕过限制

&#x1f989; AI新闻 &#x1f680; 布朗大学发现GPT-4存在新漏洞&#xff0c;可通过非常见语言绕过限制 摘要&#xff1a;布朗大学计算机科学研究人员发现了OpenAI的GPT-4存在新漏洞&#xff0c;利用不太常见的语言如祖鲁语和盖尔语可以绕过各种限制。研究人员测试了GPT-4对…

gitlab docker部署,备份,恢复。附踩坑记录

本次安装在CentOS7下进行 1、安装yum 检查是否已经安装yum yum --version如果未安装 sudo yum install -y yum-utils添加镜像源&#xff1a; 国外镜像源&#xff1a;yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo阿里镜像源&am…

【VIM TMUX】开发工具 Vim 在 bash 中的显示与 tmux 中的显示不同

开发工具 Vim 在 bash 中的显示与 tmux 中的显示不同-CSDN博客 此方法有效 方法如下&#xff1a; 1.在~/.bashrc中添加 alias tmuxtmux -2 ,然后使配置生效 $source ~/.bashrc . 2.在~/.tmux.conf中添加 set -g default-terminal "screen-256color" 完成之后即可…

最新AI创作系统ChatGPT源码+详细搭建部署教程,支持AI绘画/支持OpenAI-GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

SQL 的优化

SQL 优化是指对数据库查询语句进行优化&#xff0c;以提高查询性能和效率。下面列出了一些常见的 SQL 优化技巧&#xff1a; 1、索引优化 &#xff08;1&#xff09;使用适当的索引来加速查询操作。在频繁用于查询的列上创建索引&#xff0c;特别是在 WHERE 条件、JOIN 条件和…

AOMEI PXE Boot Free

两台电脑网线直连&#xff0c;不用设置固定IP&#xff0c;该软件包含DHCP。 名称: 3H3AOMEIPXEBootFree.rar 大小: 13068734 字节 (12 MiB) SHA1: 1e606c8c1ee3badf8af9a87f61fdf2e332b773e6 名称: PXEBoot.exe 大小: 13124928 字节 (12 MiB) SHA1: 95286ac18e9b81c2a68412c40…

[Go]配置国内镜像源

配置 Windows 选一个 go env -w GOPROXYhttps://goproxy.cn,direct go env -w GOPROXYhttps://mirrors.aliyun.com/goproxy,direct查看环境配置 go env

Uniapp路由拦截-自定义路由白名单

步骤一:新建routerIntercept.js文件 步骤二:routerIntercept文件中写入:(根据自己需要修改whiteList白名单中的页面路径和自己的逻辑处理) import Vue from vue // 白名单 const whiteList = [/pages/public/login,/pages/public/privacyAgreement, ]export default asy…

代理IP在保护跨境商家网络安全中的重要作用

在当前全球化的背景下&#xff0c;跨境电商成为一种重要的商业模式&#xff0c;越来越多的商家涌入国际市场&#xff0c;商家们通过互联网平台将商品远销国外&#xff0c;但网络安全风险随之而来。跨境商家因为需要处理大量的在线交易和产品数据&#xff0c;如果未能对这些敏感…

linux更换常用软件的默认缓存路径(.conda, .huggingface等)

在使用linux的过程中&#xff0c;我们往往会使用软件安装很多packages&#xff0c;其中的大多数软件&#xff08;例如conda&#xff09;会把当前安装的packages缓存起来&#xff0c;以加速之后的相同package的安装。 而很多软件的默认缓存路径是user自己的home路径。下面罗列几…

SSMS中的SQL sever代理

目录 一、用途&#xff1a; 二、用法 SQL Server代理&#xff08;SQL Server Agent&#xff09;是SQL Server Management Studio (SSMS) 2008中的一个功能模块&#xff0c;它用于执行和调度自动化任务、作业和脚本&#xff0c;如作业和警报。SQL Server代理允许在指定的时间间…

day27--AJAX(bootstrap之modal,toast;接口文档的一些用法;AJAX原理)

目录 Bootstrap之Modal&#xff1a; 显示和隐藏方法 通过自定义属性&#xff1a; 使用JS来控制弹框&#xff1a; Bootstrap之Toast&#xff1a; 接口文档一些用法&#xff1a; 删除图书&#xff1a; 图片上传&#xff1a; 图片上传步骤&#xff1a; 修改头像&#xf…

CVE-2017-15715 apache换行解析文件上传漏洞

影响范围 httpd 2.4.0~2.4.29 复现环境 vulhub/httpd/CVE-2017-15715 docker-compose 漏洞原理 在apache2的配置文件&#xff1a; /etc/apache2/conf-available/docker-php.conf 中&#xff0c;php的文件匹配以正则形式表达 ".php$"的正则匹配模式意味着以.ph…