【Qt】对话框

文章目录

  • [1 :peach:对话框介绍:peach:](#1 :peach:对话框介绍:peach:)
  • [2 :peach:对话框的分类:peach:](#2 :peach:对话框的分类:peach:)
    • [2.1 :apple:模态对话框:apple:](#2.1 :apple:模态对话框:apple:)
    • [2.2 :apple:非模态对话框:apple:](#2.2 :apple:非模态对话框:apple:)
    • [2.3 :apple:混合属性对话框:apple:](#2.3 :apple:混合属性对话框:apple:)
  • [3 :peach:Qt 内置对话框:peach:](#3 :peach:Qt 内置对话框:peach:)
    • [3.1 :apple:消息对话框 QMessageBox:apple:](#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中还内置了一些静态的成员函数:

使用这些函数我们可以更加方便的创建一些简单的消息对话框,比如上面的代码我们还可以这样写:

cpp 复制代码
QMessageBox::critical(this,"消息对话框","警告、警告!!!",QMessageBox::No,QMessageBox::Close);

同样的也能够完成上述的工作。

但是如果我们想要将自定义的按钮添加到消息对话框里面应该怎么办呢?我们刻意使用addButton来进行添加:

结果验证:

在一些更加复杂的业务处理中我们还可以将该按钮添加一个槽函数使用connect连接即可。

那假如我们想要知道用户点击的是哪一个按钮呢?

其实exec函数(注意show函数是没有返回值的)的返回值就可以拿到:

cpp 复制代码
    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";
相关推荐
疯一样的码农6 分钟前
Python 多线程
开发语言·python
chusheng184010 分钟前
Python 爬取大量数据如何并发抓取与性能优化
开发语言·python·性能优化
Bruce小鬼21 分钟前
QT创建按钮篇
开发语言·qt
计算机学姐21 分钟前
基于Python的影院电影购票系统
开发语言·vue.js·后端·python·mysql·pycharm·pip
是僵尸不是姜丝26 分钟前
MySQL基础篇总结
数据库·mysql
转世成为计算机大神34 分钟前
易考八股文之谈谈对sentinel的理解和作用?
java·开发语言·sentinel
微刻时光1 小时前
Docker镜像分成
java·运维·开发语言·docker·容器·镜像
尘浮生1 小时前
Java项目实战II基于Spring Boot的问卷调查系统的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
Learning改变世界1 小时前
Python快速安装软件包到环境的方案
开发语言·python
幽兰的天空1 小时前
深入解析 MySQL 数据库:锁表的处理
数据库·mysql