Qt - QDialog,QWidget实现模态及非模态

qt 模态对话框,实现阻塞其他窗口 模态对话框,就是阻塞同一应用程序中其他可视窗口的输入的对话框.你必须完成当前对话框中的操作,才能对其他的窗口进行操作,否则你点击其他的窗口是没有任何反应的,你只能完成当前窗口操作.这相当是一个操作窗口顺序的问题.2,w1.setModal(true).调用该方法参数为true(条件真),此时就能达到阻塞其他窗口的目的.比该窗口晚出现的窗口就会被当前窗口阻塞.必须先操作当前窗口.3,w1.exec().该方法使当前窗口进入循环,成功模态,你结束了当前窗口循环时,才能对其他窗口进行操作. 阅读详情

在Qt中QDialog为“窗口”,而QWidget为“部件”,首先还是了解下《Qt 窗口与部件的概念》。

对于 QDialog 的模态及非模态是直接可以实现的,很多课本中都会提到,此处总结下。

模态QDialog
方式一:

QDialog dlg(this);dlg.exec();

方式二:

QDialog *pDlg=new QDialog(this);pDlg->setModal(true);pDlg->show();

非模态QDialog

QDialog *pDlg=new QDialog(this);pDlg->show();


QDialog实现模态非模态很简单,但是对于QWidget有点迷茫,QWidget中没有exec(),也没有setModal()方式,但是想想看,QWidget作为QDialog的基类,而且QWidget作为“窗口”使用也是在平常不过了,所以会意识到QWidget中是否存在一个相对exec()或setModal()更基本的操作来实现模态和非模态呢?就这样,我找到了setWindowModality(),此函数就是用来设置QWidget运行时的程序阻塞方式的,参数解释如下:
Qt:: NonModal 不阻塞
Qt:: WindowModal 阻塞父窗口,所有祖先窗口及其子窗口
Qt:: ApplicationModal 阻塞整个应用程序

看来, setModal()也就是使用 setWindowModality()设置Qt:: ApplicationModal参数也实现的模态。

如此,要实现QWidget的模态和非模态,只要调用 setWindowModality()设置阻塞类型就好了:
QWidget *pWid = new QWidget(this);
pWid->setWindowModality(Qt::ApplicationModal);
//pWid->setAttribute(Qt::WA_ShowModal, true);
pWid->show();
但是运行发现并未实现模态效果。这里需要注意,当希望使用 setWindowModality()将QWidget设置为模态时应该保证QWidget父部件为0,这里修改QWidget *pWid = new QWidget(this);为QWidget *pWid = new QWidget(NULL);在运行就好了。

此外,通过 setWindowModality()设置模态窗口并不是唯一方式,直接设置部件(或窗口)属性也可以:

pWid->setAttribute(Qt::WA_ShowModal, true)

---------------
还有很多地方需要注意,当创建QDialog后使用setWindowFlags(Qt::FramelessWindowHint);去掉标题栏时此对话框不再阻塞父窗口,如果需要实现阻塞效果可再次指定Qt::Dialog,即使用:
setWindowFlags(Qt:: Dialog | Qt:: FramelessWindowHint); //这样就会阻塞父窗口了!
但是,这样会影响对话框的半透明(或透明)显示。使用Qt::Dialog之前半透明显示正常:
使用之后却死活不行了:
-- 不知道如何是好! 
--------------
总而言之
是否是模态和QDialog 和QWidget都可以模态和非模态.exec(), show() 等函数无直接关系,只和窗口属性有关,使用以下两种方式都行:
setAttribute(Qt::WA_ShowModal, true);//属性设置
setWindowModality(Qt::ApplicationModal);//设置阻塞类型
-----------------
QDialog中的成员函数setModal(true)及exec()之所以是模态是因为他先设置了窗口属性:setAttribute()再show()的(具体看源码)!
Qt setWindowFlags(Qt::Window)功能代码解析 非模态窗口且窗口置顶 如果需要让一个窗口支持模态和非模态窗口,一般是需要将改窗口设置为QDailog, 实现该功能的一个关键点是设置了setStyleSheet(Qt::Window),源码如下: Widget = 0x00000000, Window = 0x00000001, Dialog = 0x00000002 | Window, Qt::... 阅读详情

相关推荐

Qt QGridLayout bug

如果需要让一个窗口支持模态和非模态窗口,一般是需要将改窗口设置为QDailog, 实现该功能的一个关键点是设置了setStyleSheet(Qt::Window),源码如下: Widget = 0x00000000, Window = 0x00000001, Dialog = 0x00000002 | Window, Qt::...

a1317338022的博客 763

Qt::WindowModal和Qt::ApplicationModal的区别

Qt::WindowModal和Qt::ApplicationModal都是弹出模态窗体,但是Qt::WindowModal和Qt::ApplicationModal的模态影响的范围不同。 Qt::WindowModal 在Qt帮助文档中的解释如下: The window is modal to a single window hierarchy and blocks input to its parent window, all grandparent windows, and all siblings

danshiming的博客 6934

PyQt 模态窗口的 windowModality 属性与 modal 属性 Python

在 PyQt 中,模态窗口是一种特殊类型的窗口,它会阻止用户与其他窗口进行交互,直到该模态窗口被关闭。当 modal 属性设置为 True 时,窗口将成为模态窗口,阻止用户与其他窗口进行交互。当 modal 属性设置为 False 时,窗口将变为非模态窗口,允许用户与其他窗口进行交互。总结一下,PyQt 中的 windowModality 属性和 modal 属性是用于控制窗口模态性质的重要属性。通过设置不同的属性值,可以实现模态窗口和非模态窗口的效果。通过运行上述代码,我们可以看到主窗口中的两个按钮。

Meta_C的博客 1024

Qt——对话框详解

Qt——对话框详解

m0_73443478的博客 3664

2026年ERP选型实战:按规模分档,避开成本与实施陷阱

企业资源计划(ERP)是现代企业数字化转型的核心系统,它将财务、供应链、制造、人力等业务整合到统一平台。随着云计算和人工智能技术的发展,ERP已从传统本地部署的记录工具演变为SaaS订阅制、具备AI辅助决策能力的智能运营平台。不同规模企业在选型时的关注点差异巨大:小微企业追求轻量化和快速出报表,中型企业需要在流程标准化与业务灵活性间取得平衡,大型集团则注重多法人管控和数据治理。此外,制造、电商、工程等行业对ERP的模块要求也各有侧重,成本核算数据跑不通更是普遍痛点。如何结合企业规模与行业特征,制定合理的选型

weixin_34320724的博客 380

从零到一:STM32CubeMX虚拟串口开发中的常见陷阱与优化策略

本文深入探讨了STM32CubeMX在USB虚拟串口开发中的常见问题与优化策略,涵盖数据流吞吐量瓶颈、实时性约束等核心挑战。通过实战案例和代码示例,详细解析了波特率同步异常、数据丢失等问题的解决方案,并提供了DMA配置和中断优先级调优的高级技巧,帮助开发者提升STM32虚拟串口的性能和可靠性。

weixin_29164185的博客 370

在QWidget上实现窗口阻塞

如果可以正常使用QDialog作为模态化窗口,那最为推荐的是系统默认的,而这种强转实现的窗口阻塞只在迫不得已的情况下推荐。毕竟自带的肯定是有它的稳定性以及它的好处,否则开发者就不会这样做了。并且这种方法使用起来比较容易出现思路混乱,容易形成不好的习惯,就像我现在在创建新的界面是都是习惯性的使用QWidget,以后一定要修正这个不好的习惯,也希望大家不要向我学习。今天的更文到此结束,希望大佬批评指教!

qq_44987450的博客 2046

1991-2020年气候背景数据集

2011 年,国家气象信息中心对 1951-2010 年 2400 余个地面站气温、气压、降水、湿度、日照等 19 大要素项的定时观测资料和日极值资料中由数字化过程中引起的系统性问题(例如数字化遗漏、整段拷贝等问题)进行质量检测、质量控制和错误数据的更正,形成较高质量的地面基础资料集。1991-2020年中国地面气候值数据集提供了中国2438个站点的气温、降水、气压、风向风速、相对湿度、水汽压、云、天气现象、能见度、蒸发、积雪、地温、冻土、日照共14个要素的气候背景信息。数据时间:30年平均。

地球资源数据云的官方博客 1597

QWidget 有父指针,如何模态

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

foxgod的专栏 361

ESP32+LED12864液晶屏实战:手把手教你显示中文与自定义图标(附完整代码)

本文详细介绍了如何使用ESP32单片机驱动带字库的LED12864液晶屏,实现中文显示与自定义图标。从硬件选型、接线方案到驱动编写、字库解析,提供了完整的实战代码与优化技巧,并最终构建了一个智能家居控制面板的完整示例项目。

weixin_29212867的博客 146

DataX对接数据如何在ODS加密脱敏数据(插件开发)

datax对接mysql数据,对姓名只保留姓,名变成**。对这种简单的脱敏,可以不用修改datax源码,直接在配置文件上实现。

大模型大数据攻城狮的专栏 995

Qt中的模态、非模态、半模态窗口

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 简述区别 模态对话框 简单一点讲就是在弹出模态对话框时,除了该对话框,整个应用程序的窗口都无法接受用户响应,处于等待状态,直到模态对话框被关闭。 这时一般需要用户点击对话框中的确定或取消按钮来关闭该对话框,程序得到对话框的返回值,并根据返回值进行相应的操作,之后将操作权返回给用户。这个时候用户就可以...

billy的博客 4032

YOLOv9分割改进 ,YOLOv9分割改进主干网络为华为EfficientNet,助力涨点

EfficientNet论文中研究了卷积网络的缩放和,并证明对深度,宽度和分辨率复合缩放的重要性,因此精度和效率更好。为了阐述相关的原理,我们提出了简单有效的复合缩放方法,使得模型缩放具有一定设计准则,同时兼顾了模型的效率。我下文将 YOLOv9 分割模型改进主干网络为 EfficientNet 融合网络结构。论文地址代码地址下文都是手把手教程,跟着操作即可添加成功把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,关注我,带你不挂科!

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 938

Qt实现 模态对话框以及窗口置顶

如果是Qdialog: QDialog dialog(this); dialog.exec(); 或者通过show()函数,前提是通过setModal()设置为模态。 QDialog *dialog = new QDialog(this); dialog->setModal(true); dialog->show(); 如果是QWidget: QWidget *w = ...

c_shell_python的博客 7997

【PCIe 总线及设备入门学习专栏 6.1 -- PCIe MCTP】

MCTP 是由 DMTF(Distributed Management Task Force)定义的协议,用于提供设备和主机间基于不同传输层(如 PCIe、I²C、USB 等)的管理消息通信能力。在 PCIe 环境下,MCTP 消息作为的一种特殊形式传输,并被赋予唯一的 VDM Code 值0000b,以区别于其他 VDM。MCTP 在 PCIe 环境中作为一种基于 Type 1 VDM 的管理通信协议,提供了设备与主机之间的灵活数据传输能力。

CodingCos的博客 2128

基于Spring Boot 3 + Vue 3 + UniApp的全栈高校社团管理小程序设计与实现

requestMatchers("/api/auth/**", "/doc.html", "/webjars/**", "/v3/api-docs/**").permitAll() // 公开接口。<u-search placeholder="搜索活动" v-model="searchKeyword" @search="loadActivities" :showAction="false"></u-search>R.success("活动创建成功") : R.error("活动创建失败");

2201_76125393的博客 369

Qt - 窗口部件(部件基类-QWidget-尺寸策略)

窗口部件 默认部件基类 QT提供的默认部件基类包括QMainWindow、QWidget、和QDialog这三种,这三个部件基类也是用的最多的。 QMainWindow是带有菜单栏、工具栏、状态栏的主窗口类,它有自己单独的布局。布局有一个中心区域,通常是标准的Qt部件,也可以是定制部件,且必须有一个中心小部件。setCentralWidget()方法可设置中心部件。 QWidget类是所有部件对象的基类,被称为基础窗口部件,继承关系详看QWidget类关系图。QWidget提供自我绘制和处理用户输入等基本功

weifc-wei 的博客 1278

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Qt 模态 非模态对话框 半模态 不阻塞对话框

Qt 模态 非模态对话框 半模态 不阻塞对话框

q610098308的专栏 1198

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Qt之模态

一、简述 先简单介绍一下模态与非模态对话框。 模态对话框 简单一点讲就是在弹出模态对话框时,除了该对话框整个应用程序窗口都无法接受用户响应,处于等待状态,直到模态对话框被关闭。这时一般需要点击对话框中的确定或者取消等按钮关闭该对话框,程序得到对话框的返回值(即点击了确定还是取消),并根据返回值进行相应的操作,之后将操作权返回给用户。这个时候用户可以点击或者拖动程序其他窗口。 说白了就相当...

YBAdiam的博客 1329

QWidget、QMainWindow、QDialog区别

QWidget、QMainWindow、QDialog区别 文档名称 QWidget、QMainWindow、QDialog区别 创建时间 2012-9-4 修改时间 2012-9-11 创建人 Baifx 简介(收获) 1、继承关系:

hbyzl的专栏 470

QT - 对话框[Dialog]

在qt中的main函数中大家总会看到一个exec()函数的调用方式,一般存在于函数的最后一行用来作为返回使用。w.show();一般看到的都是用来直接在main函数中进行做返回使用,main函数中做函数返回值都是返回给系统的,所以就明白这个exec()的作用肯定跟系统处理有关。

ZHW1202的博客 1293

Qt 对话框的创建和应用

概述 对话框是与用户进行简短交互的顶层窗口。 QDialog 是 Qt 对话框钟所有对话框的基类 QDialog 继承于 QWidget 是一种容器类型的组件。 QDialog 的意义 QDialog作为一种专用的交互窗口而存在 QDialog不能作为子部件嵌入其它容器中 QDialog是定制了窗口式样的特殊的QWidget QDialog 和 QWidget 的区别 #include <QDialog> #include <QWidget> #include.

可惜可惜 525
上一篇: Qt Charts入门指南
下一篇: 回调函数详解
Maybe______
博客等级 码龄10年 26粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值