Qt GUI 概述

Qt GUI 模块提供了窗口系统集成、事件处理、OpenGL 和 OpenGL ES 集成、2D 图形、基本图像、字体和文本的类。这些类在 Qt 的用户界面技术中内部使用,但也可以直接使用,例如编写使用低级 OpenGL ES 图形 API 的应用程序。

对于编写用户界面的应用程序开发者,Qt 提供了更高等级的 API,如 Qt Quick,它比 Qt GUI 模块中的启用器更适合。

应用程序窗口

Qt GUI 模块中最重要的类是 QGuiApplicationQWindow。任何希望在屏幕上显示内容的 Qt 应用程序都必须使用这些类。QGuiApplication 包含主事件循环,在那里处理和分发来自窗口系统和其它来源的所有事件。它还处理应用程序的初始化和终结。

QWindow 类代表了底层窗口系统中的一个窗口。它提供了一些虚函数来处理来自窗口系统的事件(QEvent),如触摸输入、曝光、焦点、按键和几何变化。

2D 图形

Qt GUI 模块包含用于 2D 图形、图像、字体和高级版式的类。

使用表面类型 QSurface::RasterSurface 创建的 QWindow 可以与 QBackingStoreQPainter (Qt 高度优化的 2D 向量图形 API)结合使用。QPainter 支持绘制线条、多边形、向量路径、图像和文本。有关更多信息,请参阅《绘图系统》和《光栅窗口示例》。

Qt 使用 QImageQPixmap 类来加载和保存图像。默认情况下,Qt 支持包括 JPEG 和 PNG 在内的大多数常见图像格式。用户可以通过 QImageIOPlugin 类添加对其他格式的支持。有关更多信息,请参阅《读取和写入图像文件》。

Qt 中的版式使用 QTextDocument 完成,它结合 QPainter API 和 Qt 的字体类(主要使用 QFont)使用。那些更倾向于使用更底层 API 来处理文本和字体处理的应用程序可以使用类似 QRawFontQGlyphRun 的类。

RHI 图形

Qt渲染硬件接口是用于硬件加速图形API的抽象,例如,OpenGLOpenGL ESDirect3DMetal,和Vulkan

作为直接使用OpenGL或Vulkan渲染到QWindow的替代方案,QRhi及其相关类提供了一组便携式、跨平台的3D图形和计算API,该API由着一个着色器处理和转译管线作为补充。这样应用程序可以避免直接依赖于单一,在某些情况下,供应商或平台特定的3D API。

以下是一个与RHI相关的主要类别的列表。这些类别由一系列额外的类和结构体补充。

请参阅RHI 窗口示例,其中一个初学者示例展示了如何使用QRhi在一个QWindow上执行加速3D渲染的可移植、跨平台应用程序。

直接与QWindow一起工作是用QRhi API进行渲染的最高级和通常是最灵活的方法。然而,这是最底层的做法,并且在某些方面有限,即Qt的UI技术、小部件和Qt Quick根本没有被利用。在许多情况下,应用程序可能会将QRhi基于的渲染集成到小部件或Qt Quick基于的用户界面中。基于QWidget的应用程序可以选择通过QWidget::createWindowContainer()将窗口作为原生子元素嵌入小部件层次结构中,但在许多情况下,QRhiWidget将为将QRhi基于的渲染集成到小部件UI中提供一个更方便的启用器。Qt Quick提供了一组自己的启用器,用于通过QRhi基于的自定义渲染扩展2D/3D场景。

注意:与常规的Qt公共API相比,RHI API系列目前提供有限的兼容性保障。请参阅QRhi以获取详细信息。

3D矩阵和向量数学

Qt GUI模块还包含一些数学类,用于协助最常见与3D图形相关的数学操作。这些类别包括QMatrix4x4QVector2DQVector3DQVector4D,和QQuaternion

OpenGL和OpenGL ES集成

根据平台支持的情况,QWindow 支持使用 OpenGL 和 OpenGL ES 渲染。通过将 QWindow 的表面类型设置为 QSurface::OpenGLSurface,使用 QSurfaceFormat 选择格式属性,并创建一个 QOpenGLContext 来管理原生 OpenGL 上下文,来启用 OpenGL 渲染。此外,Qt 还提供了 QOpenGLPaintDevice,它允许使用 OpenGL 加速 QPainter 渲染,以及简化 OpenGL 代码编写的便捷类,隐藏了扩展处理和 OpenGL ES 2 与桌面 OpenGL 之间的复杂性。这些便捷类包括 QOpenGLFunctions,它允许应用程序在桌面 OpenGL 上使用所有 OpenGL ES 2 函数,无需手动解析 OpenGL 函数指针。这使得应用程序可以跨平台开发,以针对移动或嵌入式设备,并提供将原生 OpenGL 功能包装在简单 Qt API 的类。

最后,为了更好地支持更新的 OpenGL 版本(3.0 及更高版本),还提供了版本化的函数包装机制:QOpenGLFunction_N_N 类家族公开了给定 OpenGL 版本和配置文件中的所有函数,从而简化了依赖于现代、仅桌面 OpenGL 功能的桌面应用程序的开发。

有关更多信息,请参阅 OpenGL 窗口示例

使用 QSurface::OpenGLSurface 创建的 QWindow 可与 QPainterQOpenGLPaintDevice 结合使用,通过牺牲一些视觉质量来获取 OpenGL 硬件加速的 2D 图形。

Vulkan 集成

Qt GUI 支持 Vulkan API。Qt 应用程序需要存在 LunarG Vulkan SDK

在 Windows 上, SDK 设置环境变量 VULKAN_SDK,该变量将被 configure 脚本检测。

在 Android 上, Vulkan 标头被添加到 NDK 的 API 级别 24。

低级别 Vulkan 支持的主要相关类包括

此外, QVulkanWindow 提供了一个方便的 QWindow 子类,使得实现针对 QWindow 的基于 Vulkan 的渲染更加容易。使用此辅助类是完全可选的;具有更多高级基于 Vulkan 的渲染器的应用程序可能更愿意直接使用具有 QSurface::VulkanSurface 类型的 QWindow

有关更多信息,请参阅 Hello Vulkan Widget 示例Hello Vulkan 三角形示例

拖放

Qt GUI 包括对拖放的支持。有关更多信息,请参阅 拖放概述

© 2024 Qt 公司有限公司。此处包含的文档贡献者是各自所有者的版权。此处提供的文档根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款获得许可。Qt 和相应的徽标是芬兰和/或其他国家的 Qt 公司有限公司的商标。所有其他商标均属于其各自所有者。