平台集成

Qt 作为跨平台的应用程序开发工具包的主要优势在于,它消除了为每个目标平台重复编写应用程序代码的需要。

虽然 Qt 解决了许多编写应用程序的典型任务,但总有一些角落案例 Qt 无法涵盖,或者在这些情况下,在特定平台的 API 或另一个工具包之上构建功能更有意义。

为了支持这些案例,同时仍然允许 Qt 处理大量应用程序逻辑,Qt 提供了广泛的平台集成 API,从简单的类型转换到特定平台的本地接口。

类型转换

Qt 许多基本数据类型,如 QStringQPointQImage,都提供了到本地等效类型的转换。

例如,获取苹果平台上的当前用户名

NSProcessInfo *processInfo = NSProcessInfo.processInfo;
QString userName = QString::fromNSString(processInfo.userName)

有关所有类型转换的完整列表,请参阅类型转换概述。

窗口嵌入

由底层平台 API 创建的窗口可以同时用作 Qt 窗口的父容器,也可以作为子窗口嵌入到 Qt 窗口中。

如果应用程序主要使用本地平台 API 编写,但应用程序的某些部分使用 Qt(例如,绘制专用 UI),则前者很有用。要将 Qt 嵌入到本地应用的窗口层次结构中,请使用 QWindow::winId() 获取 Qt 窗口的本地句柄,然后使用本地 API 将窗口重新父化为本地 UI。

如果本地平台或另一个工具包将专用控件作为本地窗口公开,则后者很有用。通过使用 QWindow::fromWinId() 将本地窗口句柄包装在 QWindow 中,然后可以将该窗口作为任何其他 QWindow 重新父化为 Qt 窗口层次结构。要将此 QWindow 重新父化为基于 Qt Widget 的 UI,请使用特定于小部件的 QWidget::createWindowContainer() 函数。

事件处理

大多数 Qt 的事件处理用例都足够由跨平台事件传递,通过 QWindow::event() 和朋友,或通过 QObject::installEventFilter() 涵盖。

在情况不充分时,Qt 提供了对本地事件传递的访问。可以通过使用 QCoreApplication::installNativeEventFilter() 安装接收所有本地事件的全球事件过滤器,而每个窗口的本地事件都可以在 QWindow::nativeEvent() 中处理。

注意:干预本地事件流可能会使 Qt 处于不一致的状态。这些 API 应主要用于增强 Qt 的现有事件处理,例如使用 Qt 尚未处理的事件。

本地接口

上述API未涵盖的平台特定功能由Qt中的更通用的本地接口机制来处理。这些接口提供了访问它们所扩展的类的本地或平台特定API的权限。

这些接口位于QNativeInterface命名空间中,涵盖了访问底层本地句柄、采用现有的本地句柄或提供平台特定API等用例。

例如,要访问macOS上QOpenGLContext的底层NSOpenGLContext,可以通过QNativeInterface::QCocoaGLContext本地接口进行。

using namespace QNativeInterface;
if (auto *cocoaGLContext = glContext->nativeInterface<QCocoaGLContext>())
    [cocoaGLContext->nativeContext() makeCurrentContext];

要查看所有本地接口的完整列表,请参阅本地接口概览。

警告:对于本地接口API,没有源代码或二进制兼容性保证,这意味着使用这些接口的应用程序只能保证与开发时所使用的Qt版本兼容。

平台支持

除了应用开发API之外,Qt还与平台接口,以提供Qt构建块的基础实现。

例如,在Qt Core中的事件分发抽象和在RHI中的渲染硬件抽象。

这里的主要抽象层是Qt平台抽象,简称QPA,负责处理窗口系统集成和相关用例。

© 2024 The Qt Company Ltd. 本文档中包含的文档贡献权属于各自的拥有者。本处的文档是根据自由软件基金会发布的、以GNU自由文档许可证1.3版许可的。Qt及其相关标志是The Qt Company Ltd.在芬兰以及世界其他国家和地区的商标。所有其他商标均为各自拥有者的财产。