模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭。

非模态对话框就是在被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互。

1. 新建工程



2. 添加菜单栏

创建"Dialog"菜单, 添加一个"模态对话框"项和"非模块对话框项":

QMenuBar *menuBr = menuBar();
setMenuBar(menuBr);
QMenu *pDialog = menuBr->addMenu("Dialog");
QAction *p1 = pDialog->addAction("模态对话框");
QAction *p2 = pDialog->addAction("非模态对话框");

3. 创建模态对话框

包含头文件

#include <QDialog>
#include <QDebug>

点击菜单项创建模态对话框:

connect(p1, &QAction::triggered,
[=]()
{
QDialog dialog1;
dialog1.exec();
qDebug() << "11111";
}
);

运行后点击菜单下的"模态对话框对话框, 会弹出新的一个空白窗口, 但是"11111"没有输出:



在关闭模态对话框后, "11111"才输出.

4. 创建非模态对话框

connect(p2, &QAction::triggered,
[=]()
{
QDialog dialog2;
dialog2.show();
qDebug() << "11111";
}

保存运行后, 点击菜单栏下的"非模态对话框", "11111"打印出来了, 但是对话框不见了. 这是因为, 当show();不会阻塞, 在匿名函数运行完后, dialog2就被回收了, 窗口自然就消失了.

为了解决这个问题, 我们只需要把QDialog dialog2; 这句定义搬到匿名函数外面, 让dialog2作为主窗口的成员函数, 这样匿名函数运行完就不会回收掉dialog2了.

还有一种方法是, 使用new分配空间, 这样会在主对话框关闭后才释放:

connect(p2, &QAction::triggered,
[=]()
{
QDialog *dialog2 = new QDialog(this);
dialog2->show();
qDebug() << "11111";
}

我们发现. 非模态对话框出现, "11111"也打印出来了



但是这样使用new的方法, 在主对话框关闭后才释放空间, 如果我们会多次使用该菜单项创建对话框, 会占用大量内存空间, 所以更好的方式是, 不给该会话框指定父对象, 并设置在该对话框关闭后自动释放空间:

connect(p2, &QAction::triggered,
[=]()
{
QDialog *dialog2 = new QDialog;
dialog2->setAttribute(Qt::WA_DeleteOnClose);
dialog2->show();
qDebug() << "11111";
}
);

附录

mainwindow.cpp

#include "mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QDialog>
#include <QDebug> MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QMenuBar *menuBr = menuBar();
setMenuBar(menuBr);
QMenu *pDialog = menuBr->addMenu("Dialog");
QAction *p1 = pDialog->addAction("模态对话框");
QAction *p2 = pDialog->addAction("非模态对话框"); connect(p1, &QAction::triggered,
[=]()
{
QDialog dialog1;
dialog1.exec();
qDebug() << "11111";
}
); connect(p2, &QAction::triggered,
[=]()
{
QDialog *dialog2 = new QDialog;
dialog2->setAttribute(Qt::WA_DeleteOnClose);
dialog2->show();
qDebug() << "11111";
}
); } MainWindow::~MainWindow()
{ }

此文原创禁止转载,转载文章请联系博主并注明来源和出处,谢谢!

作者: Raina_RLN https://www.cnblogs.com/raina/

Qt5教程: (7) 模态/非模态对话框的更多相关文章

  1. 关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息(对对WM_INITMENUPOPUP消息的处理)

    对于模态非模态对话框默认是不响应菜单的UPDATE_COMMAND_UI消息的,需要增加对WM_INITMENUPOPUP消息的处理以后,才可以响应UPDATE_COMMAND_UI. void CX ...

  2. 十三、$.ajax、模态/非模态框、window.open()、href属性、submit()等提交请求优劣及问题解决方法

    1. $.ajax提交请求进行数据更新,并通过回调进行有效提示 function updateAudit(dispacher, control) { var currentpage = documen ...

  3. Qt对话框_模态/非模态

    对话框在Qt GUI应用程序中有着广泛的用途,对话框有模态.非模态两种情况. 对于参数选择的对话框,一般用模态对话框:对于显示或查看某些内容的对话框,一般用非模态对话框. 对话框类QDialog,官方 ...

  4. _ZNote_Qt_对话框_模态非模态

    QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框 ...

  5. QT模态对话框及非模态对话框

    QT模态对话框及非模态对话框 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对 ...

  6. MFC中的模态对话框与非模态对话框

    模态对话框创建: MyDialog mydlg; mydlg.DoModal() 当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行. 模态对话框的关闭顺序: OnCl ...

  7. Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法

    一.简述 先简单介绍一下模态与非模态对话框. 模态对话框 简单一点讲就是在弹出模态对话框时,除了该对话框整个应用程序窗口都无法接受用户响应,处于等待状态,直到模态对话框被关闭.这时一般需要点击对话框中 ...

  8. Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt::WA_ShowModal),很多讲究)good

    在Qt中QDialog为“窗口”,而QWidget为“部件”,首先还是了解下<Qt 窗口与部件的概念>. 对于 QDialog 的模态及非模态是直接可以实现的,很多课本中都会提到,此处总结 ...

  9. Qt5创建模态和非模态对话框

    1.模态对话框创建: 第一种方法: QDialog dialog(this); dialog.exec(); this为该对话框的父窗口. 第二种方法: QDialog *dialog = new Q ...

随机推荐

  1. 5.cookie每个参数的意义和作用以及工作原理?

    cookie主要参数有: (1)expires 过期时间 (2)path cookie存放路径 (3)domain 域名 同域名下可访问 (4)Set-Cookie: name cookie名称

  2. MySQL-注释-Navicat基本使用-复杂查询练习题-解题思路-pymysql操作数据库-SQL注入-05

    目录 mysql语句注释 navicat 的基本使用 特色(个人总结) 与数据服务器建立连接 创建&打开数据库.表 创建 打开 修改操作表结构 修改表结构 查询修改操作表数据 基本语句对应的操 ...

  3. Winforn中导入Excel并显示然后获取多选框选中的内容

    场景 使用NPOI导入Excel并赋值给DataTable,然后显示在DataGrdView上,并且添加多选框,然后获取选中行的内容. Winform中使用NPOI实现Excel导入并赋值给DataT ...

  4. Jenkins 持续集成安装及使用简介

    博客地址:http://www.moonxy.com 一.前言 持续集成(Continuous integration,简称CI)指的是,频繁地(一天多次)将代码集成到主干. 持续集成的目的,就是让产 ...

  5. JAVA用递归来判断回文串

    用递归来判断回文串 思路: ①首先如果是空串,一个字符,则判断是回文串 ②若不满足①,则我们需要对字符串进行递归判断,我们会想到要用第一个字符和最后一个字符进行比较,若相同则,第二个和倒数第二个进行比 ...

  6. [VB.NET Tips]字符串连接

    在很多应用场景下我们都需要对字符串进行拼接操作. 在每一次连接字符串时,都要在堆上分配新的内存空间,每一个分配都有一定的消耗. 较长的字符串在堆中分配,对其进行连接操作需要花费很长的时间,先连接小的字 ...

  7. [Full-stack] 一切皆在云上 - AWS

    一元课程:https://edu.51cto.com/center/course/lesson/index?id=181407[非常好] Based on AWS Lambda. 包含:DevOps ...

  8. 使用Python3.6的标准GUI库tkinter快速创建GUI应用程序

    Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 ...

  9. 利用百度云接口实现车牌识别·python

    一个小需求---实现车牌识别. 目前有两个想法 1. 调云在线的接口或者使用SDK做开发(配置环境和变异第三方库麻烦,当然使用python可以避免这些问题) 2. 自己实现车牌识别算法(复杂) 一开始 ...

  10. Creating a Store Locator with PHP, MySQL & Google Maps(保存地图坐标 经纬度方法 google mysql)

    Google Geo APIs Team August 2009 This tutorial is intended for developers who are familiar with PHP/ ...