【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";
相关推荐
快乐就好ya30 分钟前
Java多线程
java·开发语言
CS_GaoMing1 小时前
Centos7 JDK 多版本管理与 Maven 构建问题和注意!
java·开发语言·maven·centos7·java多版本
2401_858120532 小时前
Spring Boot框架下的大学生就业招聘平台
java·开发语言
转调2 小时前
每日一练:地下城游戏
开发语言·c++·算法·leetcode
Java探秘者2 小时前
Maven下载、安装与环境配置详解:从零开始搭建高效Java开发环境
java·开发语言·数据库·spring boot·spring cloud·maven·idea
2301_786964362 小时前
3、练习常用的HBase Shell命令+HBase 常用的Java API 及应用实例
java·大数据·数据库·分布式·hbase
2303_812044462 小时前
Bean,看到P188没看了与maven
java·开发语言
秋夫人3 小时前
idea 同一个项目不同模块如何设置不同的jdk版本
java·开发语言·intellij-idea
不穿格子衬衫3 小时前
常用排序算法(下)
c语言·开发语言·数据结构·算法·排序算法·八大排序
萧鼎3 小时前
Python调试技巧:高效定位与修复问题
服务器·开发语言·python