当前位置: 首页 > article >正文

【Qt】对话框

 对话框的基本概念

        在使用某些网站的时候,有时会不经意间弹出各种奇奇怪怪的窗口。这种窗口就被称之为对话框。对话框往往是用户与用户之间进行“短平快"的操作。

对话框是 GUI 程序中不可或缺的组成部分。⼀些不适合在主窗⼝实现的功能组件可以设置在对话框中。对话框通常是⼀个顶层窗⼝,出现在程序最上层,⽤于实现短期任务或者简洁的⽤户交互。

Qt中使用QDialog类表示对话框。关于对话框,针对一个已有的项目,可以创建出一些类,继承自QDialog实现自定义的对话框,也可以使用由Qt给提供的现成的对话框。

内置对话框有:QFiledialog(⽂件对话框)、QColorDialog(颜⾊对话框)、QFontDialog (字体对话框)、QInputDialog (输⼊对话框)和 QMessageBox(消息框) 

例子:观察QDialog窗口

基于QDialoh作为父类创建出来的程序窗口和之前通过QWidget创建出来的窗口是非常相似的。

 

在实际开发过程中,使用更多的情况,往往不是直接在创建项目的时候继承自QDialog,而是在代码中,创建额外的类,让额外的类继承自QDialog。

【说明】主窗口一般是不会作为一个对话框,主窗口一般可以在产生出一些其他的对话框。

对话框的内存释放问题

例子:点击按钮弹出对话框

(1)在Qt Desiger中设置一个按钮

(2)编辑点击按钮的槽函数

QDialog其实也是QWidget的子类,QWidget的各种属性方法,QDialog都可以进行使用。

【注意】不同于界面上的其他控件,此处QDialog每次按下按钮,都会创建一个新的QDialog对象,并进行显示,每次点击都会创建新的对话框对象。这就会导致一个程序在运行过程中,可以无数次点击这个按钮,进一步就会产生无数个这样的对象,也就会产生内存泄漏问题。

        虽然QDialog的父元素设置为this,QMainWindow被销毁的时候,此时QDialog也会随之销毁,但是如果QMainWindow在QMainWindow销毁之前存在多个就无法实现销毁。(可能用户不会创建多个QDialog对象,但是可能QDialog对象占用内存较大,或者其机器本身剩余的内存较少(嵌入式系统))。

如果将将delete放在点击按钮的槽函数中,对话框只会一闪而过。

正确的操作应该是:用户在点击对话框关闭按钮的时候,再来触发delete操作。

而Qt为了让程序员写的方便,直接给QDialog设置了一个属性,可以通过设置属性,进而完成上述操作。

例子:自定义对话框界面

要想自定义对话框,就需要继承自QDialog创建类。有俩种方式

(1)纯代码的方式自定义QDialog界面

(2)通过图形化的方式

方法一:纯代码的方式自定

(1)使用Qt Designer设置一个按钮

(2)点击编写点击按钮的槽函数

(3)创建一个Dialog类

(4)编写点击按钮的槽函数

由于构造dialog对象指定了父对象,所以构造函数的时候需要指定父对象。

(5)Dialog的构造函数

在这个构造函数中,它调用了父类 QDialog 的构造函数,将 parent 参数传递给父类构造函数,以便在 Qt 的对象层次结构中正确地设置父 - 子关系。

(6)编写对话框里的内容

方法二:通过图形化界面的方式

(1)创建一个QMainWindow窗口,打开Qt Designer并创建一个按钮

(2)右键点击按钮转到槽函数

(3)新建对话框ui文件

通过图形化界面的方式,其关键操作就是需要创建一个新的ui文件

(4)编辑对话框ui文件,设置一个label与PushButton

(5)编辑mianWindow.cpp文件,包含dialog.h头文件,编辑点击按钮弹出对话框

(6)编辑dialog.ui文件,右键点击按钮转到槽,编辑点击按钮关闭对话框的槽函数

(8)运行程序

模态对话框

对话框分为:模态对话框以及非模态对话框

模态:是指弹出对话框的时候,此时用户无法操作父窗口,必须得先完成对话框内部出的操作,关闭对话框之后才可与父窗口进行交互。

非模态:弹出对话框的时候,用户可以操作父窗口。

模态对话框用户特别关键的场合,用户必须要做出决策。

  • 模态对话框指的是:显⽰后⽆法与⽗窗⼝进⾏交互,是⼀种阻塞式的对话框。使⽤ QDialog::exec() 函数 调⽤。

    模态对话框适⽤于必须依赖⽤⼾选择的场合,⽐如消息显⽰,⽂件选择,打印设置等。

  • ⾮模态对话框显⽰后独⽴存在,可以同时与⽗窗⼝进⾏交互,是⼀种⾮阻塞式对话框,使⽤ QDialog::show()函数调⽤。

    ⾮模态对话框适⽤于特殊功能设置的场合,⽐如查找操作,属性设置等。

    ⾮模态对话框⼀般在堆上创建,这是因为如果创建在栈上时,弹出的⾮模态对话框就会⼀闪⽽过。同 时还需要设置 Qt:WA_DeleteOnClose 属性,⽬的是:当创建多个⾮模态对话框时(如打开了多个⾮模态窗⼝),为了避免内存泄漏要设置此属性

前文介绍的例子,都是“非模态”对话框。那么如何产生模态对话框?将show函数换成exec函数即可。

Qt内置对话框

Qt中提供了多种可复⽤的对话框类型,即 Qt 标准对话框。Qt 标准对话框全部继承于 QDialog类。常⽤标准对话框如下:

 


http://www.kler.cn/a/288209.html

相关文章:

  • 基于GPU器件行为的创新分布式功能安全机制为智能驾驶保驾护航
  • 【C++】—— map 与 set 深入浅出:设计原理与应用对比
  • PdServer:调用MidjourneyAPI完成静夜思图文生成
  • ABAP关于PS模块CJ20N中项目物料的屏幕和字段增强CI_RSADD
  • 自动化工具 Gulp
  • 《Python网络安全项目实战》项目5 编写网站扫描程序
  • K8s系列之:解释Kubernetes Operators
  • 71. 简化路径算法实现详解(goalng版)
  • 快速了解Rust 的数据分析库Polars
  • 常见概念 -- WSS光层环回
  • Django Admin优化查询
  • 金融知识普及月答题活动
  • 【Linux】进程状态和进程优先级
  • 【实战教程】用 Next.js 和 shadcn-ui 打造现代博客平台
  • AR 眼镜之-系统通知定制(通知弹窗)-实现方案
  • Leetcode3249. 统计好节点的数目
  • 驾驭Python与MySQL的桥梁:pymysql的神秘面纱
  • FlowUs 小程序:开启高效之旅,订阅内容超精彩
  • csrf的详解
  • 产业园区智慧招商解决方案
  • 今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月3日,星期二
  • P1.25/P1.538/P1.86COB/GOB超微小间距LED显示屏替换SMD时代到来
  • 常用排序算法(上)
  • 机器学习中的增量学习(Incremental Learning,IL)策略是什么?
  • Java基础 ——线程
  • QSlider禁止点击 和精准点击跳转