【Qt】顶层窗口和普通窗口区别以及用法

news2024/11/26 4:52:44

区别

在Qt项目开发中,经常会用到窗体控件用于显示及数据操作和其他交互等。
但,窗体分为顶层窗口(Top-level Window)和普通窗口(Regular Window)。
他们之间是有区别的,包括在项目实际中的用法等。
在使用Qt进行窗口编程时,了解和理解顶层窗口和普通窗口的区别是很重要的,因为它们的创建、管理和行为可能会有所不同。这样可以确保窗口的正确显示和交互。
下面是它们之间的主要区别:

  1. 样式

顶层窗口通常是应用程序的主窗口,例如主窗口、对话框或主要的独立窗口。它们有特定的样式和布局,可能包含菜单栏、工具栏、状态栏等。
而普通窗口是应用程序中的其他窗口,通常用于显示特定的内容,如子窗口、自定义对话框等。

  1. 窗口管理

顶层窗口拥有独立的任务栏图标,并且可以有额外的窗口管理功能,例如最大化、最小化、关闭按钮等。
普通窗口通常依赖于父窗口的管理,没有自己的任务栏图标。

  1. 关系

顶层窗口可以是应用程序的根窗口,其他窗口可以作为其子窗口或对话框进行管理。
普通窗口通常是依附于某个父窗口或者作为顶层窗口的非模态对话框。

  1. 窗口属性

顶层窗口拥有一些特殊的窗口属性,例如Qt::WindowFlags中的Qt::Window和Qt::Dialog属性。这些属性控制了窗口的行为和外观。
普通窗口通常默认拥有Qt::Widget属性。

此外,还可以设置窗口的类型:

Qt窗口类型

Qt 窗口标志枚举类型用于指定小部件的各种窗口系统属性。其中一些标志取决于底层窗口管理器是否支持它们。以下是窗口类型作用一览表:

窗口类型描述
Qt::QWidget这是 QWidget 的默认类型。如果它们有父级,这种类型的部件是子部件,如果没有父控件,则为独立窗口。
Qt::Window通常具有窗口系统框架和标题栏。请注意,如果部件没有父控件,则无法取消设置此标记(可以用在弹出子窗口比父窗口大很多的情况下)。
Qt::Dialog对话框(通常标题栏中没有最大化或最小化按钮)。dget这是 QDialog 的默认类型。如果要将其用作模态对话框,则应从另一个窗口启动它。
Qt::SheetmacOS 表单式窗口。由于使用工作表意味着窗口模态,推荐的方法是使用QWidget :: setWindowModality()或QDialog :: open()。
Qt::DrawermacOS 抽屉式窗口。
Qt::Popup弹出式顶层窗口,即它是模态的,但具有适合弹出菜单的窗口系统框架。
Qt::Tool工具窗口。工具窗口通常是一个小窗口,其标题栏和装饰比通常小,通常用于工具按钮的集合。 如果有父部件,则工具窗口将始终保持在其上。
Qt::Tooltip工具提示窗口。 这在内部用于实现工具提示,没有标题栏和窗口边框。
Qt::SplashScreen闪屏。 这是 QSplashScreen 的默认类型。
Qt::SubWindow子窗口,例如 QMdiSubWindow 窗口小部件。
Qt::ForeignWindow表示由另一个进程创建的本机平台窗口或手动使用本机代码的句柄。
Qt::CoverWindow代表一个封面窗口,例如,当应用程序在 BlackBerry 平台上最小化时显示。

比如:

QWidget* pW = new QWidget();
pW->setWindowFlags(Qt::Dialog);

窗口还可以设置为无边框或者置顶。

窗口标志

以下为可以设置多个的窗口标志对照表:

窗口标志描述
Qt::MSWindowsFixedSizeDialogHint Windows系统固定大小窄边框窗口
Qt::X11BypassWindowManagerHint无窗口边框的窗口,完全忽视窗口管理器和用户无法使用键盘进行
Qt::FramelessWindowHint无法移动和改变大小的无窗口边框的窗口
Qt::NoDropShadowWindowHint禁用窗口阴影
Qt::WindowTitleHint带标题栏的窗口
Qt::WindowSystemMenuHint带系统菜单和尽可能地添加一个关闭按钮的窗口
Qt::CustomizeWindowHint关闭默认窗口标题提示栏
Qt::WindowMinimizeButtonHint窗口添加一个最小化按钮
Qt::WindowMaximizeButtonHint窗口添加一个最大化按钮
Qt::WindowCloseButtonHint窗口添加一个关闭按钮
Qt::WindowContextHelpButtonHint窗口添加一个帮助按钮
Qt::WindowShadeButtonHint如果窗口管理器支持,则在最小化按钮的位置添加一个阴影按钮
Qt::WindowStaysOnTopHint通知窗口系统置顶窗口
Qt::WindowStaysOnBottomHint通知窗口系统置于最底层窗口

示例

// 设置无窗口边框 | 窗口置顶 
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);

Qt 开始界面有一个 示例教程:Window Flags,展示了使用 Qt 中可用的窗口标志类型来指定窗口系统属性。
在QtCreator示例,搜索可以找到:
在这里插入图片描述
窗口除了可以设置标志外,还可以设置属性。

窗口属性

通过 setAttribute 函数可以对 QWidget 对象设置 Qt::WidgetAttribute 枚举属性,从而改变 QWidget 对象的某些特性。

窗口属性描述
Qt::WA_AcceptDrops接受拖放,QWidget::setAcceptDrops()是此设置的便捷函数。
Qt::WA_DeleteOnCloseQWidget 关闭时被 delete。
Qt::WA_Disabled设置小部件(注意是小部件,对窗口无效)被禁用(相对于调用setEnabled(false);)。
Qt::WA_ForceUpdatesDisabled禁用更新,即使其所有祖先都设置为启用更新状态,它仍将保持禁用状态。(相当于调用QWidget::setUpdatesEnabled())。
Qt::WA_Hover当鼠标进入或离开小部件时,强制 Qt 生成绘制事件。此功能通常在实现自定义样式时使用。
Qt::WA_InputMethodEnabled启用亚洲语言的输入法。创建自定义文本编辑小部件时必须设置。
Qt::WA_KeyboardFocusChange当用户使用键盘(tab、backtab 或快捷键)时更改焦点。用于顶层窗口设置。
Qt::WA_NoChildEventsForParent小部件不希望将 ChildAdded 或 ChildRemoved 事件发送到其父级。
Qt::WA_NoChildEventsFromChildren小部件不希望接收从其子部件发送的 ChildAdded 或 ChildRemoved 事件。
Qt::WA_NoMousePropagation禁止将鼠标事件传播到小部件的父级。默认情况下禁用此属性。
Qt::WA_TransparentForMouseEvents将禁用向小部件及其子部件传递鼠标事件。默认情况下禁用此属性。
Qt::WA_NoSystemBackground小部件没有背景,即当小部件接收到绘制事件时,背景不会自动重新绘制。窗口设置这个效果就是全黑。
Qt::WA_OpaquePaintEvent小部件在接收到绘制事件时绘制其所有像素。因此,在生成绘制事件之前,不需要更新、调整大小、滚动和焦点更改等操作来擦除小部件。
Qt::WA_PaintUnclipped使在此小部件上操作的所有 QPainter 对象的绘制都不裁剪(即 QPainter 设置裁剪区域无效)。只有设置了Qt::WA_PaintOnScreen标志的小部件才支持此标志。
Qt::WA_PaintOnScreen表示小部件要直接在屏幕上绘制。具有此属性集的小部件不参与组合管理,即它们不能是半透明的或通过半透明重叠小部件发光。它将禁用双缓冲。
Qt::WA_QuitOnClose小部件作为最后一个接受closeEvent()时,使 Qt 退出应用程序。可以使用QApplication::quitOnLastWindowClosed属性修改此行为。默认情况下,该属性为 Qt::Window 类型的所有小部件设置。
Qt::WA_Resized指示小部件具有明确的大小。该标志由QWidget::resize()和QWidget::setGeometry()设置或清除。
Qt::WA_AlwaysShowToolTips设置窗口(注意是窗口,当 QWidget 作为子部件时无效)为非活动时也显示提示信息。(setToolTip()设置了窗口提示信息)

下面重点介绍几个常用或特殊的属性:

Qt::WA_TransparentForMouseEvents

Qt 官方对Qt::WA_TransparentForMouseEvents的解释如下:

When enabled, this attribute disables the delivery of mouse events to the widget and its children. Mouse events are delivered to other widgets as if the widget and its children were not present in the widget hierarchy; mouse clicks and other events effectively “pass through” them. This attribute is disabled by default.
翻译是:
当该属性被激活启用时,将会使所有发送到窗体和窗体内部子控件的鼠标事件无效。鼠标事件被分发到其它的窗体部件,就像本窗体部件及本窗体内的子控件没有出现在窗体层次体系中。鼠标单击和鼠标其它事件高效地穿过(即绕开)本窗体部件及其内的子控件,这个属性默认是禁用未开启的。

Qt::WA_StaticContents

Qt 官方对Qt::WA_StaticContents解释如下:

Indicates that the widget contents are north-west aligned and static. On resize, such a widget will receive paint events only for parts of itself that are newly visible. This flag is set or cleared by the widget’s author.
翻译是:
指示窗体内容靠西北方向即左上角对齐且是静态的。当窗体大小调整时,仅仅只有那些新露出来的可见窗体部分才会绘制。这个标识由窗体的开发者清除或设置。

通常情况下,当重新定义一个窗口部件大小时,Qt 会为窗口部件的整个可见区域生成一个绘制事件。但是如果该窗口部件在创建时使用了 Qt::WA_StaticContens 属性,那么绘制事件的区域就会被严格限定在之前没有被显示最近刚露出的部分上。这也就意味着,如果重新把窗口部件改变为比原来还要小的尺寸,那么就根本不会产生任何绘制事件。这在某些情况下,可以提到性能,降低 cpu 效率,当以前绘制的东西很费时间时(如:某个曲线、某个图形是经过某个复杂的数学运算得出的),不重绘、不重新计算,这将节约很多 cpu 时间,大大提高效率。

Qt::WA_OpaquePaintEvent

Qt 官方对Qt::WA_OpaquePaintEvent解释如下:

Indicates that the widget paints all its pixels when it receives a paint event. Thus, it is not required for operations like updating, resizing, scrolling and focus changes to erase the widget before generating paint events. The use of WA_OpaquePaintEvent provides a small optimization by helping to reduce flicker on systems that do not support double buffering and avoiding computational cycles necessary to erase the background prior to painting. Note: Unlike WA_NoSystemBackground, WA_OpaquePaintEvent makes an effort to avoid transparent window backgrounds. This flag is set or cleared by the widget’s author.
翻译是:
指示窗体在收到绘制事件时,绘制它的所有像素。因此,在收到绘制事件之前,对于更新、大小调整、滚动条滚动、焦点更变等操作时,并不要求窗体擦除窗体背景。使用该标志对那些不支持双缓冲区的系统提供了小小的优化,从而减小闪烁;同时避免在绘制之前因擦除背景需要计算而耗费时间。不同于 WA_NoSystemBackground 标志,WA_OpaquePaintEvent 尽量避免窗体背景透明,这个标志是由窗体的开发者设置或清除。

注:有时候设置 WA_OpaquePaintEvent 属性,会影响用样式表设置窗口的背景颜色。

以上是 Qt 官方的解释。

翻译过来就是:
指示窗体在收到绘制事件时,绘制它的所有像素。这里“收到绘制事件”应该是第一次收到绘制事件时,也即窗体构建时,就把窗体所有的像素绘制一遍。
窗体一旦在完成,上面说的绘制完一遍所有像素后,此后所有有关窗体的更新、大小改变,焦点改变、滚动条滚动等操作都不会擦除窗体背景。也就是说以前画的东西都不会擦除重绘。也就是以前画的不重新计算、不重新绘制。当以前绘制的东西很费时间时(如:某个曲线、某个图形是经过某个复杂的数学运算得出的),不重绘、不重新计算,这将节约很多 cpu 时间大大提高效率(这也就是设置本标志后,不闪烁的原因吧)。

Qt::WA_NoMousePropagation

在 Qt 中,鼠标事件包含:鼠标按键按下,鼠标按键释放,鼠标双击事件,鼠标移动事件。分别由下面的 event handler(事件处理器,实际上就是一些可override的函数)来处理:

// 鼠标点击事件
virtual void mousePressEvent(QMouseEvent *event);
// 鼠标离开事件
virtual void mouseReleaseEvent(QMouseEvent *event);
// 鼠标双击事件
virtual void mouseDoubleClickEvent(QMouseEvent *event);
// 鼠标移动事件
virtual void mouseMoveEvent(QMouseEvent *event);

鼠标事件属于冒泡事件,鼠标事件会一直随着其父对象一直路由下去,直到有其祖先所在的 widget 接受它,或者有事件过滤器消耗它。

注意:如果鼠标事件被路由到包含Qt:: WA_NoMousePropagation窗口属性(即该属性设置为 true)的窗口小部件,该鼠标事件不会进一步沿着父控件链路由。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1070808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue面试题十一】、Vue组件之间的通信方式都有哪些?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:Vue组件之间的通信方式都…

学习网络编程No.7【应用层之序列化和反序列化】

引言: 北京时间:2023/9/14/19:13,下午刚刚更完文章,是一篇很久很久以前的文章,由于各种原因,留到了今天更新,非常惭愧呀!目前在上学校开的一门网络课程,学校的课听不了一…

leetCode 1143.最长公共子序列 动态规划

1143. 最长公共子序列 - 力扣(LeetCode) 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串…

Linux登录自动执行脚本

一、所有用户每次登录时自动执行。 1、在/etc/profile文件末尾添加。 将启动命令添加到/etc/profile文件末尾。 2、在/etc/profile.d/目录下添加sh脚本。 在/etc/profile.d/目录下新建sh脚本,设置每次登录自动执行脚本。有用户登录时,/etc/profile会遍…

一文带你读懂残差网络ResNet

🚀 作者 :“码上有钱” 🚀 文章简介 :AI-残差算法 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬简介 残差网络(Residual Neural Network, ResNet)是深度神经网络的一种。它通…

2.1 关系数据结构及形式化定义

思维导图: 2.1.1 关系 笔记: 关系数据库模型是一个简单但强大的方式来表示数据及其之间的关系。下面是这节的关键内容: - **关系模型核心概念** * 关系数据模型的核心是“关系”,它在逻辑上表现为一个二维表。 * 此表中&a…

Cesium问题——在使用贴图的方式加载图片时并未加载出来

文章目录 问题分析问题 Cesium在使用贴图的方式加载图片失败 分析 如果在Cesium中加载图片时,控制台显示成功(200状态码),但是预览显示却失败了,可能有以下几个原因: 图片格式不受支持:Cesium中通常支持常见的图片格式,如JPEG、PNG等。确保你使用的图片格式在Cesium中…

Spring Boot中实现发送文本、带附件和HTML邮件

SpringBoot实现发送邮箱 引言 在现代应用程序中,电子邮件通常是不可或缺的一部分。在Spring Boot中,你可以轻松地实现发送不同类型的邮件,包括文本、带附件和HTML邮件。本博客将向你展示如何使用Spring Boot发送这些不同类型的电子邮件。 步…

《从零开始学ARM》勘误

1. 50页 2 51页 3 236页 14.2.3 mkU-Boot 修改为: mkuboot 4 56页 修改为: 位[31:24]为条件标志位域,用f表示; 位[23:16]为状态位域,用s表示; 位[15:8]为扩展位域&…

前端页面布局之【Grid布局】详解

目录 🌟前言🌟浏览器支持🌟Gird简介和基本概念🌟属性介绍🌟 父元素上的属性🌟 设置grid布局🌟设置网格的列数与行数🌟通过网格单元的名字来布局 grid-template-areas🌟设…

资深8年测试总结,web网页测试bug定位详细步骤,一文打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、前置条件 1&a…

助力农作物病虫害检测识别,基于yolov3—yolov8开发构建马铃薯作物甲虫检测识别系统

AI加持的智慧农业也是一个比较有前景的赛道,近些年来已经有很多不错的方向做出来成绩,基于AI的激光除草、灭虫等也是其中的一个热门,杂草相关的检测识别在我们之前的项目实例中已经有相关的实践了,这里本文的主要目的就是以农作物…

最短路径专题8 交通枢纽 (Floyd求最短路 )

题目: 样例: 输入 4 5 2 0 1 1 0 2 5 0 3 3 1 2 2 2 3 4 0 2 输出 0 7 思路: 由题意,绘制了该城市的地图之后,由给出的 k 个编号作为起点,求该点到各个点之间的最短距离之和最小的点是哪个,并…

分布式数据库(林子雨慕课课程)

文章目录 4. 分布式数据库HBase4.1 HBase简介4.2 HBase数据模型4.3 HBase的实现原理4.4 HBase运行机制4.5 HBase的应用方案4.6 HBase安装和编程实战 4. 分布式数据库HBase 4.1 HBase简介 HBase是BigTable的开源实现 对于网页搜索主要分为两个阶段 1.建立整个网页索引&#xf…

第八章 排序 十四、最佳归并树

目录 一、定义 二、多路最佳归并树 三、多路最佳归并树少了一个归并段 四、总结 一、定义 最佳归并树是指将若干个有序序列合并成一个有序序列的一种方式,使得所有合并操作的总代价最小的一棵二叉树。其中,代价通常指合并两个有序序列的操作次数或比…

挑选出优秀的项目管理软件,满足您的需求

Zoho Projects是很好的一个项目管理软件,不管是web端还是APP没有那些乱七八糟的广告,光是这一点,就让人用着很舒服。除此之外还有更多让人意想不到的惊喜,软件界面设置的井井有条,关键是软件有完全免费版的&#xff0c…

mp4视频太大怎么压缩变小?

mp4视频太大怎么压缩变小?确实,很多培训和教学都转向了线上模式,这使得我们需要下载或分享大量的在线教学视频。然而,由于MP4视频文件通常较大,可能会遇到无法打开或发送的问题。为了解决这个问题,我们可以…

WMS仓储管理系统在快消品生产企业中有哪些应用

随着企业规模的扩大和市场竞争的加剧,仓库管理在企业管理中的地位越来越重要。对于快消品生产企业来说,仓库管理更是关系到产品的质量和市场竞争力。为了提高仓库管理的效率和准确性,许多企业开始引入WMS仓储管理系统解决方案。 中小企业WMS系…

网络安全(黑客)——自学

前言: 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“…

山东济南建筑模板厂家批发之桉木芯建筑模板

济南建筑模板厂家是建筑行业中非常重要的供应商之一。建筑模板是建筑施工中必不可少的一种材料,用于支撑混凝土浇筑和模板安装。在选择建筑模板材料时,我们需要考虑各类材料的特点和优缺点,以及与传统的建筑木模板相比的价格、耐用性和经济效…