【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类。常⽤标准对话框如下: