Qt5教程: (7) 模态/非模态对话框
模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭。
非模态对话框就是在被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互。
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) 模态/非模态对话框的更多相关文章
- 关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息(对对WM_INITMENUPOPUP消息的处理)
对于模态非模态对话框默认是不响应菜单的UPDATE_COMMAND_UI消息的,需要增加对WM_INITMENUPOPUP消息的处理以后,才可以响应UPDATE_COMMAND_UI. void CX ...
- 十三、$.ajax、模态/非模态框、window.open()、href属性、submit()等提交请求优劣及问题解决方法
1. $.ajax提交请求进行数据更新,并通过回调进行有效提示 function updateAudit(dispacher, control) { var currentpage = documen ...
- Qt对话框_模态/非模态
对话框在Qt GUI应用程序中有着广泛的用途,对话框有模态.非模态两种情况. 对于参数选择的对话框,一般用模态对话框:对于显示或查看某些内容的对话框,一般用非模态对话框. 对话框类QDialog,官方 ...
- _ZNote_Qt_对话框_模态非模态
QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框 ...
- QT模态对话框及非模态对话框
QT模态对话框及非模态对话框 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对 ...
- MFC中的模态对话框与非模态对话框
模态对话框创建: MyDialog mydlg; mydlg.DoModal() 当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行. 模态对话框的关闭顺序: OnCl ...
- Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法
一.简述 先简单介绍一下模态与非模态对话框. 模态对话框 简单一点讲就是在弹出模态对话框时,除了该对话框整个应用程序窗口都无法接受用户响应,处于等待状态,直到模态对话框被关闭.这时一般需要点击对话框中 ...
- Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt::WA_ShowModal),很多讲究)good
在Qt中QDialog为“窗口”,而QWidget为“部件”,首先还是了解下<Qt 窗口与部件的概念>. 对于 QDialog 的模态及非模态是直接可以实现的,很多课本中都会提到,此处总结 ...
- Qt5创建模态和非模态对话框
1.模态对话框创建: 第一种方法: QDialog dialog(this); dialog.exec(); this为该对话框的父窗口. 第二种方法: QDialog *dialog = new Q ...
随机推荐
- 近日让很多人议论纷纭的P++,PHP新分支?
最近大家可能有看到一个新的名词——P++. 很巧这个词来源于不久前从 Zend 公司离职的 Zeev Suraski 以 PHP 开发组成员的身份提议要创建 PHP 方言,暂命名为 P++. 老兄最近 ...
- .netCore部署在IIS上遇到的问题(500.19,500.21错误)
1.确保IIS功能都安装上了. 2.确保.netcore 的最新sdk已安装. 3.应用程序池改成无托管代码 4.500.19错误 错误原因,没有安装 DotNetCore.2.0.5-Windows ...
- java.lang.IllegalArgumentException: System memory 259522560 must be at least 471859200.
报错信息 java.lang.IllegalArgumentException: System memory 259522560 must be at least 471859200. Please ...
- Java秒杀系统优化的工程要点
这篇博客是笔者学习慕课网若鱼老师的<Java秒杀系统方案优化 高性能高并发实战>课程的学习笔记.若鱼老师授课循循善诱,讲解由浅入深,欢迎大家支持. 本文记录课程中的注意点,方便以后code ...
- jenkins自动化部署项目7 -- 新建job(将服务代码部署在windows上)
关于构建结束后jenkins会kill所有衍生子进程的官方解决方案:https://wiki.jenkins.io/display/JENKINS/Spawning+processes+from+bu ...
- Hive之行转列与列转行
行转列 原始数据: 需求: 把星座和血型一样的人归类到一起.结果如下: 射手座,A 大海|凤姐 白羊座,A 孙悟空|猪八戒 白羊座,B 宋宋 实现: vi person_info.txt 孙悟空 白羊 ...
- commons-beanutils.jar及其支持文件
下载地址: 链接:https://pan.baidu.com/s/1AtiK3nsk0aBuBfMdNwBVGw 密码:6tul
- JS的运动1(从简单到复杂运动,从单一属性到多属性同时进行的运动过程分析)
js运动原理 运动基础 在js中,让一个元素动起来的最简单的方式,就是点击按钮,让元素移动.下面是一个简单的案例:(下面几个案例的的html和css都是采用这个为例) <!DOCTYPE htm ...
- Python学习笔记整理总结【Django】:Form组件
Form组件 Django的Form主要具有一下几大功能: --生成HTML标签 --验证用户数据(显示错误信息) --HTML Form提交保留上次提交数据 --初始化页面显示内容 1.内置字段 ...
- Oracle 的 rownum 问题
对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=),并非说用>,>=,=,be ...