【Qt】顶层窗口和普通窗口区别以及用法
最佳答案 问答题库978位专家为你答疑解惑
区别
在Qt项目开发中,经常会用到窗体控件用于显示及数据操作和其他交互等。
但,窗体分为顶层窗口(Top-level Window
)和普通窗口(Regular Window
)。
他们之间是有区别的,包括在项目实际中的用法等。
在使用Qt进行窗口编程时,了解和理解顶层窗口和普通窗口的区别是很重要的,因为它们的创建、管理和行为可能会有所不同。这样可以确保窗口的正确显示和交互。
下面是它们之间的主要区别:
- 样式
顶层窗口通常是应用程序的主窗口,例如主窗口、对话框或主要的独立窗口。它们有特定的样式和布局,可能包含菜单栏、工具栏、状态栏等。
而普通窗口是应用程序中的其他窗口,通常用于显示特定的内容,如子窗口、自定义对话框等。
- 窗口管理
顶层窗口拥有独立的任务栏图标,并且可以有额外的窗口管理功能,例如最大化、最小化、关闭按钮等。
普通窗口通常依赖于父窗口的管理,没有自己的任务栏图标。
- 关系
顶层窗口可以是应用程序的根窗口,其他窗口可以作为其子窗口或对话框进行管理。
普通窗口通常是依附于某个父窗口或者作为顶层窗口的非模态对话框。
- 窗口属性
顶层窗口拥有一些特殊的窗口属性,例如Qt::WindowFlags中的Qt::Window和Qt::Dialog属性。这些属性控制了窗口的行为和外观。
普通窗口通常默认拥有Qt::Widget属性。
此外,还可以设置窗口的类型:
Qt窗口类型
Qt 窗口标志枚举类型用于指定小部件的各种窗口系统属性。其中一些标志取决于底层窗口管理器是否支持它们。以下是窗口类型作用一览表:
比如:
QWidget* pW = new QWidget();
pW->setWindowFlags(Qt::Dialog);
窗口还可以设置为无边框或者置顶。
窗口标志
以下为可以设置多个的窗口标志对照表:
示例
// 设置无窗口边框 | 窗口置顶
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
Qt 开始界面有一个 示例教程:Window Flags
,展示了使用 Qt 中可用的窗口标志类型来指定窗口系统属性。
在QtCreator示例,搜索可以找到:
窗口除了可以设置标志外,还可以设置属性。
窗口属性
通过 setAttribute 函数可以对 QWidget 对象设置 Qt::WidgetAttribute 枚举属性,从而改变 QWidget 对象的某些特性。
下面重点介绍几个常用或特殊的属性:
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)的窗口小部件,该鼠标事件不会进一步沿着父控件链路由。
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"【Qt】顶层窗口和普通窗口区别以及用法":http://eshow365.cn/6-17666-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 蓝桥杯每日一题2023.10.8
- 下一篇: Redis-数据过期策略