窗口和对话框小部件#

Qt中的窗口和对话框。

不嵌入父窗口的小部件称为窗口。通常,窗口有框架和标题栏,尽管也可以使用合适的窗口标志创建不带此类装饰的窗口。在Qt中,小部件和各种QMainWindowQDialog子类的子类是最常见的窗口类型。

在应用程序中,窗口为用户界面提供了屏幕空间。窗口将应用程序在视觉上进行隔离,并提供一个允许您根据个人喜好调整大小和位置的窗口装饰。窗口通常整合到桌面环境中,并且在一定程度上由桌面环境提供的窗口管理系统进行管理。例如,应用程序选定的窗口在任务栏中表示。

主要窗口和次要窗口#

任何没有父窗口的QWidget将成为一个窗口,在大多数平台上将在桌面任务栏中列出。这通常只适用于应用程序中的一个窗口,即主窗口

此外,具有父窗口的QWidget可以通过设置Qt::Window标志成为窗口。根据窗口管理系统,此类次要窗口通常堆叠在其各自的父窗口之上,并且不具有自己的任务栏条目。

QMainWindow类在其构造函数中设置Qt::Window标志,因为它被设计为用作窗口,并为子窗口不需要的功能提供设施。

主窗口和对话框#

应用程序主窗口提供了一个构建应用程序主用户界面的框架,通过继承 QMainWindow 来创建。 QMainWindow 拥有它自己的布局,您可以在其中添加一个 菜单栏工具栏可停靠控件 和一个 状态栏 。中心区域可以被任何类的 QWidget 占用。

对话框用作包含选项和选择的次要窗口。对话框通过继承 QDialog 并使用 控件和布局 来实现用户界面创建。此外,Qt 还提供了一些现成的标准对话框,可用于文件或字体选择等标准任务。

主窗口和对话框都可以使用 Qt Designer 来创建,它是 Qt 的视觉设计工具。使用 Qt Designer 比手动编码快得多,并且可以轻松测试不同的设计想法。通过视觉设计并阅读由 uic 生成的代码来创建设计是学习 Qt 的好方法!

窗口几何形状#

QWidget 提供了处理小控件几何形状的几个函数。其中一些函数操作纯客户端区域(即不包括窗口边框的窗口),而另一些则包括窗口边框。 QWidget 以一种透明的方式涵盖了最常见的用法。

请注意,这种区别仅在装饰了的最顶层小部件中才有意义。对于所有子小部件,框架几何形状等于客户端几何形状。

此图展示了大部分正在使用的功能

../_images/geometry.png

X11 特殊性#

在 X11 中,窗口直到窗口管理器装饰它之前没有框架。这发生在调用 show() 和窗口第一次接收到绘制事件后的某个时间点,或者在所有情况下都不发生。请注意,X11 是无政策的(其他人称其为灵活)。因此,你不能对窗口将得到的装饰框架做出任何安全假设。基本规则是:总有一个用户使用了一个会破坏你的假设的窗口管理器,并会向你抱怨。

此外,工具包不能简单地放置窗口在屏幕上。Qt 能够做的就是向窗口管理器发送某些提示。窗口管理器是一个独立的过程,它可以执行、忽略或误解它们。由于部分不明确的客户间通信约定手册(ICCCM),现有的窗口管理器处理窗口放置的方式不同。

X11 不提供标准的或简单的方法来获取已装饰的窗口的框架几何形状。Qt 通过巧妙的启发式和值得赞扬的代码来解决这个问题,这些代码适用于今天存在的广泛窗口管理器。不过,如果您发现 frameGeometry() 返回错误的结果,请不要感到惊讶。

X11 也不提供一种方式来最大化窗口。必须使用frameGeometry() 和窗口管理器正确放置窗口的能力来模拟这个功能。其结果取决于 frameGeometry() 和无法保证的窗口管理器。

Wayland 特殊性#

在 Wayland 上,通常不支持从客户端程序设置或获取顶级窗口的位置。从技术上讲,这取决于 shell 接口。然而,对于典型的桌面组合器,默认的 shell 接口将是 XDG Shell,它不支持手动放置窗口。在这种情况下,Qt 将忽略设置顶级窗口位置的调用,并且当查询时,窗口位置将始终返回为 QPoint(0, 0)。