窗口和对话框小部件#
Qt中的窗口和对话框。
不嵌入父窗口的小部件称为窗口。通常,窗口有框架和标题栏,尽管也可以使用合适的窗口标志创建不带此类装饰的窗口。在Qt中,小部件和各种QMainWindow
和QDialog
子类的子类是最常见的窗口类型。
在应用程序中,窗口为用户界面提供了屏幕空间。窗口将应用程序在视觉上进行隔离,并提供一个允许您根据个人喜好调整大小和位置的窗口装饰。窗口通常整合到桌面环境中,并且在一定程度上由桌面环境提供的窗口管理系统进行管理。例如,应用程序选定的窗口在任务栏中表示。
主要窗口和次要窗口#
任何没有父窗口的QWidget将成为一个窗口,在大多数平台上将在桌面任务栏中列出。这通常只适用于应用程序中的一个窗口,即主窗口。
此外,具有父窗口的QWidget可以通过设置Qt::Window标志成为窗口。根据窗口管理系统,此类次要窗口通常堆叠在其各自的父窗口之上,并且不具有自己的任务栏条目。
QMainWindow
类在其构造函数中设置Qt::Window标志,因为它被设计为用作窗口,并为子窗口不需要的功能提供设施。
主窗口和对话框#
应用程序主窗口提供了一个构建应用程序主用户界面的框架,通过继承 QMainWindow
来创建。 QMainWindow
拥有它自己的布局,您可以在其中添加一个 菜单栏
, 工具栏
, 可停靠控件
和一个 状态栏
。中心区域可以被任何类的 QWidget
占用。
对话框用作包含选项和选择的次要窗口。对话框通过继承 QDialog
并使用 控件和布局 来实现用户界面创建。此外,Qt 还提供了一些现成的标准对话框,可用于文件或字体选择等标准任务。
主窗口和对话框都可以使用 Qt Designer 来创建,它是 Qt 的视觉设计工具。使用 Qt Designer 比手动编码快得多,并且可以轻松测试不同的设计想法。通过视觉设计并阅读由 uic 生成的代码来创建设计是学习 Qt 的好方法!
窗口几何形状#
QWidget
提供了处理小控件几何形状的几个函数。其中一些函数操作纯客户端区域(即不包括窗口边框的窗口),而另一些则包括窗口边框。 QWidget
以一种透明的方式涵盖了最常见的用法。
包括窗口边框:
x()
,y()
,frameGeometry()
,pos()
,和move()
。不包括窗口框架:
geometry()
,width()
,height()
,rect()
以及size()
.
请注意,这种区别仅在装饰了的最顶层小部件中才有意义。对于所有子小部件,框架几何形状等于客户端几何形状。
此图展示了大部分正在使用的功能
X11 特殊性#
在 X11 中,窗口直到窗口管理器装饰它之前没有框架。这发生在调用 show()
和窗口第一次接收到绘制事件后的某个时间点,或者在所有情况下都不发生。请注意,X11 是无政策的(其他人称其为灵活)。因此,你不能对窗口将得到的装饰框架做出任何安全假设。基本规则是:总有一个用户使用了一个会破坏你的假设的窗口管理器,并会向你抱怨。
此外,工具包不能简单地放置窗口在屏幕上。Qt 能够做的就是向窗口管理器发送某些提示。窗口管理器是一个独立的过程,它可以执行、忽略或误解它们。由于部分不明确的客户间通信约定手册(ICCCM),现有的窗口管理器处理窗口放置的方式不同。
X11 不提供标准的或简单的方法来获取已装饰的窗口的框架几何形状。Qt 通过巧妙的启发式和值得赞扬的代码来解决这个问题,这些代码适用于今天存在的广泛窗口管理器。不过,如果您发现 frameGeometry()
返回错误的结果,请不要感到惊讶。
X11 也不提供一种方式来最大化窗口。必须使用frameGeometry()
和窗口管理器正确放置窗口的能力来模拟这个功能。其结果取决于 frameGeometry()
和无法保证的窗口管理器。
Wayland 特殊性#
在 Wayland 上,通常不支持从客户端程序设置或获取顶级窗口的位置。从技术上讲,这取决于 shell 接口。然而,对于典型的桌面组合器,默认的 shell 接口将是 XDG Shell
,它不支持手动放置窗口。在这种情况下,Qt 将忽略设置顶级窗口位置的调用,并且当查询时,窗口位置将始终返回为 QPoint(0, 0)。