窗口和对话框小部件¶
Qt中的窗口和对话框。
一个没有嵌入到父部件中的widget被称为窗口。通常,窗口有一个框架和一个标题栏,尽管也可以使用适当的窗口标志创建没有这种装饰的窗口。在Qt中,QMainWindow和QDialog的各种子类是最常见的窗口类型。
在应用程序中,窗口提供了构建用户界面的屏幕空间。窗口在视觉上将应用程序彼此分开,通常提供窗口装饰,允许您根据自己的偏好调整应用程序的大小和位置。窗口通常集成到桌面环境中,并在一定程度上由桌面环境提供的窗口管理系统管理。例如,应用程序的选定窗口会在任务栏中表示。
主窗口和次窗口¶
任何没有父级的QWidget都将成为一个窗口,并且在大多数平台上会列在桌面的任务栏中。这通常只适用于应用程序中的一个窗口,即主窗口。
此外,具有父级的QWidget可以通过设置Qt::Window标志成为窗口。根据窗口管理系统的不同,这些次级窗口通常堆叠在各自的父窗口之上,并且没有自己的任务栏条目。
QMainWindow 类在其构造函数中设置了 Qt::Window 标志,因为它设计为用作窗口,并提供了子部件不需要的功能。
主窗口和对话框¶
应用程序主窗口提供了构建应用程序主用户界面的框架,并通过子类化QMainWindow来创建。QMainWindow有自己的布局,您可以向其中添加菜单栏、工具栏、可停靠小部件和状态栏。中心区域可以由任何类型的QWidget占据。
对话框窗口 用作次级窗口,向您展示选项和选择。对话框通过子类化 QDialog 并使用 小部件和布局 来实现用户界面。此外,Qt 提供了许多现成的标准对话框,可用于文件或字体选择等标准任务。
主窗口和对话框都可以使用Qt Widgets Designer(Qt的可视化设计工具)来创建。使用Qt Widgets 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 也没有提供最大化窗口的方法。showMaximized() 必须模拟这一功能。其结果取决于 frameGeometry() 的结果以及窗口管理器进行适当窗口放置的能力,这两者都无法保证。
Wayland 特性¶
在Wayland上,通常不支持从客户端以编程方式设置或获取顶层窗口的位置。从技术上讲,这取决于shell接口。然而,对于典型的桌面合成器,默认的shell接口将是XDG Shell,它不支持手动定位窗口。在这种情况下,Qt将忽略设置窗口顶层位置的调用,并且在查询时,窗口位置将始终返回为QPoint(0, 0)。