窗口和对话框小部件

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

在应用程序中,窗口提供了构建用户界面的屏幕空间。窗口将应用程序彼此分离,通常提供一种窗口装饰,允许您根据偏好调整应用程序的大小和位置。窗口通常集成到桌面环境中,并部分由桌面环境提供的窗口管理系统管理。例如,应用程序选中窗口的表示将出现在任务栏中。

主窗口和次级窗口

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

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

QMainWindow类在构造函数中设置Qt::Window标志,因为它设计为用作窗口,并提供不希望对子窗口使用的功能。

主窗口和对话框

应用程序主窗口为主用户界面的构建提供框架,通过继承QMainWindow创建。QMainWindow有自己的布局,您可以向其中添加菜单栏工具栏可浮动小部件状态栏。中心区域可以由任何类型的QWidget占据。

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

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

窗口几何形状

QWidget 提供了处理小部件几何形状的多个功能。其中一些函数作用于纯客户端区域(即不包括窗口框架的窗口),其他包括窗口框架。QWidget 以一种透明的方式区分最常用的用法。

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

此图显示了大多数正在使用的功能

Geometry diagram

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) 返回。

© 2024 The Qt Company Ltd. 本文档中包含的贡献权归各自所有者所有。所提供的文档根据自由软件基金会的发布,遵循GNU自由文档许可证1.3版本的条款。Qt及其相关标志是芬兰特有的或全球其他国家/地区的The Qt Company Ltd.的商标。所有其他商标均为各自所有者的财产。