本页内容

窗口和对话框控件

未嵌入父控件的控件称为窗口。通常,窗口具有边框和标题栏,但也可以通过使用适当的窗口标志来创建没有此类装饰的窗口。在 Qt 中,QMainWindow 以及QDialog 的各种子类是最常见的窗口类型。

在应用程序中,窗口提供了构建用户界面的屏幕空间。窗口在视觉上将各个应用程序相互区分开来,并且通常提供窗口装饰,允许您根据个人偏好调整应用程序的大小和位置。 窗口通常集成在桌面环境中,并在一定程度上由桌面环境提供的窗口管理系统进行管理。例如,应用程序中选中的窗口会显示在任务栏中。

主窗口与次窗口

任何没有父窗口的QWidget 都会成为一个窗口,并在大多数平台上显示在桌面的任务栏中。通常,应用程序中只有一个窗口需要这样处理,即主窗口。

此外,具有父窗口的QWidget 也可以通过设置Qt::Window 标志来成为一个窗口。根据窗口管理系统的不同,此类次级窗口通常会叠加在各自的父窗口之上,并且不会在任务栏中拥有独立的条目。

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

主窗口和对话框

应用程序主窗口为构建应用程序的主用户界面提供了框架,可通过继承QMainWindow 类来创建。QMainWindow 具有自己的布局,您可以在其中添加menu bar 、tool bars 、dockable widgets 和status bar 。中心区域可由任何类型的QWidget 占据。

对话框(Dialog Windows)作为辅助窗口,用于向用户展示选项和选择项。对话框通过继承QDialog 类,并使用控件和布局来实现用户界面。此外,Qt还提供了一系列现成的标准对话框,可用于文件或字体选择等常规任务。

主窗口和对话框均可通过 Qt 的可视化设计工具Qt Widgets Designer 创建。使用Qt Widgets Designer 比手动编写代码快得多,并且便于测试不同的设计方案。通过可视化方式创建设计并阅读uic生成的代码,是学习 Qt 的绝佳方式!

窗口几何属性

QWidget 提供了若干用于处理小部件几何属性的函数。其中一些函数仅作用于纯客户端区域(即不包含窗口边框的窗口部分),另一些则包含窗口边框。QWidget 通过某种方式进行了区分,从而能够透明地覆盖最常见的使用场景。

请注意,这种区别仅对经过装饰的顶级小部件有效。对于所有子小部件,其边框几何尺寸均等于该小部件的客户端几何尺寸。

下图展示了其中大部分函数的应用情况:

标注了尺寸和位置的窗口几何图形

X11 的特殊之处

在 X11 中,窗口在窗口管理器对其进行装饰之前不会拥有边框。这一过程是在调用 `QWidget::show()` 函数后,窗口收到第一个绘制事件之前的某个时间点以异步方式发生的,否则则根本不会发生。 请牢记,X11 没有固定规则(其他人称之为灵活)。因此,你无法对窗口将获得的装饰边框做出任何安全的假设。基本规则是:总会有一位用户使用某种会打破你假设的窗口管理器,并且会向你投诉。

此外,工具包无法直接将窗口放置在屏幕上。Qt 所能做的只是向窗口管理器发送某些提示。作为独立进程的窗口管理器,可能会遵从、忽略或误解这些提示。由于《客户端间通信约定手册》(ICCCM)部分内容尚不明确,现有窗口管理器在窗口定位方面的处理方式各不相同。

一旦窗口被装饰,X11 便无法提供获取窗口边框几何信息的标准或简便方法。Qt 通过巧妙的启发式算法和精妙的代码解决了这个问题,这些方案适用于当今绝大多数现有的窗口管理器。不过,如果你发现某个窗口管理器中QWidget::frameGeometry() 返回了错误结果,也请不要感到惊讶。

X11 也没有提供将窗口最大化显示的方法。QWidget::showMaximized() 必须模拟这一功能。其结果取决于QWidget::frameGeometry() 的返回值以及窗口管理器进行正确窗口布局的能力,而这两者都无法得到保证。

Wayland 的特殊性

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

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.