窗口和对话框小部件

未嵌入父窗口部件的窗口部件称为窗口。窗口通常有一个框架和一个标题栏,不过也可以使用合适的窗口标志创建没有这些装饰的窗口。在 Qt 中,QMainWindowQDialog 的各种子类是最常见的窗口类型。

在应用程序中,窗口提供了建立用户界面的屏幕空间。窗口在视觉上将应用程序彼此分隔开来,并通常提供一种窗口装饰,让您可以根据偏好调整应用程序的大小和位置。窗口通常集成到桌面环境中,并在一定程度上由桌面环境提供的窗口管理系统进行管理。例如,选定的应用程序窗口会显示在任务栏中。

主窗口和辅助窗口

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

此外,有父窗口的QWidget 也可以通过设置Qt::Window 标志成为窗口。根据窗口管理系统的不同,这些辅助窗口通常会被堆叠在各自的父窗口之上,并且没有自己的任务栏条目。

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

主窗口和对话框

应用程序主窗口为构建应用程序的主用户界面提供了框架,它是通过子类化QMainWindow 创建的。QMainWindow 有自己的布局,您可以在其中添加menu bartool barsdockable widgetsstatus bar 。中心区域可由任何类型的QWidget 占用。

对话窗口作为辅助窗口为您提供选项和选择。对话框是通过子类化QDialog 并使用部件和布局来实现用户界面而创建的。此外,Qt 还提供了大量现成的标准对话框,可用于文件或字体选择等标准任务。

主窗口和对话框都可以用Qt Widgets Designer-- Qt 的可视化设计工具来创建。使用Qt Widgets Designer 比手工编码要快得多,而且可以轻松测试不同的设计理念。以可视化方式创建设计并阅读uic生成的代码是学习 Qt 的好方法!

窗口几何

QWidget 提供了几个处理 widget 几何形状的函数。其中一些函数对纯客户端区域(即不包括窗框的窗口)进行操作,另一些函数则包含窗框。 以透明的方式对最常见的用法进行了区分。QWidget

请注意,这种区别只适用于装饰过的顶层部件。对于所有子窗口部件,框架的几何形状等于窗口部件客户端的几何形状。

该图显示了大部分使用中的函数:

几何图形

X11 特性

在 X11 上,在窗口管理器对窗口进行装饰之前,窗口是没有框架的。在调用QWidget::show() 和窗口接收到的第一个绘制事件之后的某个时间点,会异步发生这种情况,或者根本不会发生。请记住,X11 是无策略的(也有人称之为灵活的)。因此,您无法对窗口将获得的装饰框架做出任何安全的假设。基本规则总有一个用户使用的窗口管理器会打破你的假设,并向你抱怨。

此外,工具包不能简单地在屏幕上放置窗口。Qt 能做的只是向窗口管理器发送某些提示。窗口管理器是一个独立的进程,它可以服从、忽略或误解这些提示。由于《客户端间通信约定手册》(Inter-Client Communication Conventions Manual,ICCCM)部分内容不明确,窗口放置在现有窗口管理器中的处理方式有所不同。

X11 没有提供标准或简便的方法来获取窗口装饰后的框架几何图形。Qt 通过巧妙的启发式方法和聪明的代码解决了这一问题,并适用于目前存在的各种窗口管理器。如果您发现QWidget::frameGeometry() 返回错误结果,请不要感到惊讶。

X11 也没有提供最大化窗口的方法。QWidget::showMaximized() 必须模拟这一功能。它的结果取决于QWidget::frameGeometry() 的结果以及窗口管理器正确放置窗口的能力,而这两者都无法保证。

Wayland 的特殊性

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

© 2025 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.