文章目录
- 1 :peach:对话框介绍:peach:
- 2 :peach:对话框的分类:peach:
- 2.1 :apple:模态对话框:apple:
- 2.2 :apple:非模态对话框:apple:
- 2.3 :apple:混合属性对话框:apple:
- 3 :peach:Qt 内置对话框:peach:
- 3.1 :apple:消息对话框 QMessageBox:apple:
1 🍑对话框介绍🍑
对话框是 GUI 程序中不可或缺的组成部分。⼀些不适合在主窗⼝实现的功能组件可以设置在对话框中。对话框通常是⼀个顶层窗⼝,出现在程序最上层,⽤于实现短期任务或者简洁的⽤⼾交互。Qt常⽤的内置对话框有:QFiledialog
(⽂件对话框)、QColorDialog
(颜⾊对话框)、QFontDialog
(字体对话框)、QInputDialog
(输⼊对话框)和 QMessageBox
(消息框) 。
2 🍑对话框的分类🍑
对话框分为 模态对话框 和 非模态 对话框。
2.1 🍎模态对话框🍎
模态对话框指的是:显⽰后⽆法与⽗窗⼝进⾏交互,是⼀种阻塞式的对话框。使⽤ QDialog::exec()
函数 调⽤。模态对话框适⽤于必须依赖⽤⼾选择的场合,⽐如消息显⽰,⽂件选择,打印设置等。
代码示例:
验证:
此时如果我们在未关闭该对话框的话就不能够去点击父窗口相关的控件了。
2.2 🍎非模态对话框🍎
⾮模态对话框显⽰后独⽴存在,可以同时与⽗窗⼝进⾏交互,是⼀种非阻塞式对话框,使⽤QDialog::show()
函数调⽤。⾮模态对话框⼀般在堆上创建,这是因为如果创建在栈上时,弹出的⾮模态对话框就会⼀闪⽽过。同时还需要设置 Qt:WA_DeleteOnClose
属性,⽬的是:当创建多个⾮模态对话框时(如打开了多个⾮模态窗⼝),为了避免内存泄漏要设置此属性。⾮模态对话框适⽤于特殊功能设置的场合,⽐如查找操作,属性设置等。
代码示例:
验证:
此时在关闭对话框前我们可以还打开很多个对话框。代码中我们还设置了Qt:WA_DeleteOnClose
属性来防止内存泄漏,大家此时可能会有疑问,我们不是将对话框加入到了MainWindow的对象树里面去了吗?MainWindow销毁时这些对话框不就会自动销毁吗?按道理这样是没错,但是在MainWindow未退出前,如果创建了非常多的对话框,此时可能会造成大量空间浪费,所以使用Qt:WA_DeleteOnClose
属性后当我们点击对话框右上角的X
后就会被自动回收。
2.3 🍎混合属性对话框🍎
混合属性对话框同时具有模态对话框和⾮模态对话框的属性,对话框的⽣成和销毁具有⾮模态对话框属性,功能上具有模态对话框的属性。使⽤ QDialog::setModal()
函数 可以创建混合特性的对话框。通常,创建对话框时需要指定对话框的⽗组件。
代码示例:
效果就跟模态对话框一致。
3 🍑Qt 内置对话框🍑
Qt 提供了多种可复⽤的对话框类型,即 Qt 标准对话框。Qt 标准对话框全部继承于 QDialog
类。常⽤标准对话框如下:
3.1 🍎消息对话框 QMessageBox🍎
消息对话框是应⽤程序中最常⽤的界⾯元素。消息对话框主要⽤于为⽤⼾提⽰重要信息,强制⽤⼾进⾏选择操作。QMessageBox类 中定义了静态成员函数,可以直接调⽤创建不同⻛格的消息对话框,其中包括:
我这里就只演示Critical风格的消息对话框,其他的也同理:
代码示例:
结果验证:
除了使用上面的方式外,QMessageBox中还内置了一些静态的成员函数:
使用这些函数我们可以更加方便的创建一些简单的消息对话框,比如上面的代码我们还可以这样写:
QMessageBox::critical(this,"消息对话框","警告、警告!!!",QMessageBox::No,QMessageBox::Close);
同样的也能够完成上述的工作。
但是如果我们想要将自定义的按钮添加到消息对话框里面应该怎么办呢?我们刻意使用addButton
来进行添加:
结果验证:
在一些更加复杂的业务处理中我们还可以将该按钮添加一个槽函数使用connect
连接即可。
那假如我们想要知道用户点击的是哪一个按钮呢?
其实exec
函数(注意show
函数是没有返回值的)的返回值就可以拿到:
QPushButton* button=new QPushButton(this);
button->setText("kill all");
message->addButton(button,QMessageBox::AcceptRole);
int t=message->exec();
if(t == QMessageBox::No)
qDebug()<<"No";
else if(t == QMessageBox::Yes)
qDebug()<<"Yes";
else
qDebug()<<"Other";