【Qt】对话框QDialog

2023-10-11 09:21
文章标签 qt 对话框 qdialog

本文主要是介绍【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


这篇关于【Qt】对话框QDialog的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/187085

相关文章

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点