Qt专栏之模态与非模态对话框的实现

 更新时间:2021年04月06日 10:31:21   作者:至纯设计  
这篇文章主要介绍了Qt专栏之模态与非模态对话框的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、概念介绍

什么是模态对话框和非模态对话框呢?我们日常使用软件过程中很常见的现象,点击某个软件上某个按钮会弹出对话框窗口,此时对于其他窗口而言:

可以同时对其他窗口进行操作的称为非模态

不可以同时,只能操作当前弹出的窗口的称为模态

二、代码示例

2.1模态对话框示例代码

/*在主类对象的构造函数中我们新建一个按钮用于弹出对话框*/
QPushButton *btn = new QPushButton("new",this);
/*信号与槽的连接
槽函数通过Lambda表达式实现
主要功能实现了点击一个new按钮,弹出一个模态对话框
*/
connect(btn,&QPushButton::clicked,[=](){
QDialog dlg(this)  ;
dlg.exec(); 
});

注意包含头文件QPushButton以及QDialog

15

2.2非模态对话框示例代码

/*在主类对象的构造函数中我们新建一个按钮用于弹出对话框*/
QPushButton *btn = new QPushButton("new",this);
/*信号与槽的连接,槽函数通过Lambda表达式实现
主要功能实现了点击一个new按钮,弹出一个非模态对话框
*/
connect(btn,&QPushButton::clicked,[=](){
QDialog *dlg = new QDialog(this) ;
dlg->show();
});

好奇,为什么是对话框,上面模态直接 QDialog dlg(this);而非模态就需要new呢?那是因为构造函数中在栈中声明定义的变量在构造函数运行完成后,就会被回收。

因此,new一个对象实例,利用上的空间即可,可以试试两种实现效果的不同,这边我们演示的效果如下:

16

三、非模态下的内存泄漏隐患

假设一下,在我们上述的非模态场景下,点击按钮new一个对象示例后,我们关掉对话框,由于使用空间,只要主窗口QObject未被析构回收内存,继续点击按钮就会又创建一个新的对象实例,循环反复一直创建到达一定数量级,就会导致堆溢出

解决办法就是使用setAttribute()设置属性函数,设置属性值Qt::WA_DeleteOnClose,意思就是当弹出的非模态对话框关闭,既删除该对象内存,以上面的例子添加如下代码:

dlg->setAttribute(Qt::WA_DeleteOnClose);

四、标准对话框

标准对话框:Qt内置了一系列对话框,用于简化开发。事实上,有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有程序中几乎相同,因此没有必要在每一个程序中都自己实现这么一个对话框。

Qt 的内置对话框大致分为以下几类:

  • QColorDialog:选择颜色;
  • QFileDialog:选择文件或者目录;
  • QFontDialog:选择字体;
  • QInputDialog:允许用户输入一个值,并将其值返回;
  • QMessageBox:模态对话框,用于显示信息、询问问题等;
  • QPageSetupDialog:为打印机提供纸张相关的选项;
  • QPrintDialog:打印机配置;
  • QPrintPreviewDialog:打印预览;
  • QProgressDialog:显示操作过程。

到此这篇关于Qt专栏之模态与非模态对话框的实现的文章就介绍到这了,更多相关Qt 模态与非模态对话框内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C++实现动态线性表

    C++实现动态线性表

    这篇文章主要为大家详细介绍了C++实现动态线性表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C++基于Boost.Asio实现端口映射器的过程详解

    C++基于Boost.Asio实现端口映射器的过程详解

    Boost.Asio 是一个功能强大的 C++ 库,用于异步编程和网络编程,它提供了跨平台的异步 I/O 操作,在这篇文章中,我们将深入分析一个使用 Boost.Asio 实现的简单端口映射服务器,文中有详细的代码讲解,需要的朋友可以参考下
    2023-11-11
  • c++中map的基本用法和嵌套用法实例分析

    c++中map的基本用法和嵌套用法实例分析

    这篇文章主要介绍了c++中map的基本用法和嵌套用法,以实例形式分析了map容器的基本使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • 解析C++编程中的选择结构和switch语句的用法

    解析C++编程中的选择结构和switch语句的用法

    这篇文章主要介绍了解析C++编程中的选择结构和switch语句的用法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言 详细解析时间复杂度与空间复杂度

    C语言 详细解析时间复杂度与空间复杂度

    算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小
    2022-04-04
  • Visual Studio配置静态库详细步骤和关键配置项

    Visual Studio配置静态库详细步骤和关键配置项

    这篇文章主要介绍了Visual Studio配置静态库的详细步骤和关键配置项的相关资料,静态库是一系列预先编译好的目标文件(.o文件或.obj文件)的集合,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-12-12
  • C++如何调用opencv完成运动目标捕捉详解

    C++如何调用opencv完成运动目标捕捉详解

    OpenCV作为机器视觉开源库,使用起来非常不错,这篇文章主要给大家介绍了关于C++如何调用opencv完成运动目标捕捉的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • C++实现线性表顺序存储的示例代码

    C++实现线性表顺序存储的示例代码

    这篇文章主要为大家详细介绍了C++实现线性表顺序存储的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-03-03
  • 解析C++编程中如何使用设计模式中的状态模式结构

    解析C++编程中如何使用设计模式中的状态模式结构

    这篇文章主要介绍了如何在C++编程中适用设计模式中的状态模式结构,状态模式强调将特定状态相关的逻辑分散到一些类的状态类中,需要的朋友可以参考下
    2016-03-03
  • 简单了解C语言中直接插入排序与直接选择排序实现

    简单了解C语言中直接插入排序与直接选择排序实现

    这篇文章主要介绍了C语言中直接插入排序与直接选择排序实现,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,需要的朋友可以参考下
    2016-03-03

最新评论