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

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值