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

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

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. 《Java 8 in Action》Chapter 10:用Optional取代null

    1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法.ALGOL W是第一批在堆上分配记录的类型语言之一.Hoare选择null引用这种方式,& ...

  2. JSP获取网络IP地址

    import javax.servlet.http.HttpServletRequest; public class RemoteAddress { public static String getR ...

  3. Linux环境下进行分布式压测踩过的坑

    背景:公司为了满足大并发的情况,需要测试组配合,就需要分布式压测,这里我把我踩过坑都记录下来: 环境:Linux + jmeter-v.5.1.1;使用3台2核4G的压力机: Q1: Server f ...

  4. Day 8 面试题

    一.选择题(每题2分) #####1.1 设超级用户root当前所在目录为:/usr/local,键入cd命令后, 用户当前所在目录为(B) A:/home B:/root C:/home/root ...

  5. Tcloud 云测平台-多服务框架开源

    技术栈 Python3.7 + Vue前端github地址:https://github.com/bigbaser/Tcloud后端github地址:https://github.com/bigbas ...

  6. Spring boot 自定义banner的在线制作

    目前工作不是很忙,利用闲暇的时间,在给自己不断地充电,提升自己的技术实力. 目前在做一个基于Spring Boot2.x+webmagic+quartz的爬虫项目[hotDog]https://git ...

  7. BCD 码、Gray 码、ASCII 码都是什么呢?

    BCD 码:即(Binary Coded Decimal)码,也称为 8421 码,是十进制代码中最常见的一种.每一位的 1 代表的十进制数称为这一位的权.BCD 码中每一位的权都是固定不变的,它属于 ...

  8. 微服务SpringCloud之注册中心Consul

    Consul 介绍 Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发 ...

  9. Kafka系列一之架构介绍和安装

    Kafka架构介绍和安装 写在前面 还是那句话,当你学习一个新的东西之前,你总得知道这个东西是什么?这个东西可以用来做什么?然后你才会去学习它,使用它.简单来说,kafka既是一个消息队列,如今,它也 ...

  10. JavaScipt第四天笔记

    JS笔记 1.以后遇到用构造函数创建对象就用NEW 2.用构造函数创建对象语法: var obj1 = new Object();//创建一个空对象 var obj2 = new Object({ n ...