平台集成
Qt 作为跨平台应用程序开发工具包的主要优势在于无需为每个目标平台重复编写应用程序代码。
虽然 Qt 解决了编写应用程序的许多典型任务,但总有一些 Qt 无法覆盖的情况,或者在特定平台 API 或其他工具包之上构建功能更有意义的情况。
为了支持这些用例,同时仍允许 Qt 处理大部分应用程序逻辑,Qt 提供了广泛的平台集成 API,从简单的类型转换到平台特定的本地接口。
类型转换
Qt 的许多基本数据类型,如QString 、QPoint 或QImage ,都提供了与本地等价类型之间的转换。
例如,在 Apple 平台上获取当前用户的用户名:
NSProcessInfo *processInfo = NSProcessInfo.processInfo; QString userName = QString::fromNSString(processInfo.userName)
有关所有类型转换的完整列表,请参阅类型转换概述。
窗口嵌入
由底层平台 API 创建的窗口既可用作 Qt 窗口的父容器,也可作为子窗口嵌入到 Qt 窗口中。
如果应用程序主要使用本地平台 API 编写,但部分应用程序使用 Qt(例如绘制专门的用户界面),前者就非常有用。要将 Qt 嵌入本地应用程序的窗口层次结构,可使用QWindow::winId() 获取 Qt 窗口的本地句柄,然后使用本地 API 将窗口重新导向本地 UI。
如果本地平台或其他工具包将专门控件作为本地窗口公开,那么后者就非常有用。通过使用QWindow::fromWinId() 将本地窗口句柄封装在一个QWindow 中,窗口就可以像其他任何QWindow 一样被重新导向到 Qt 窗口层次结构中。要将此QWindow 重新导向基于 Qt XML 的 widget 用户界面,请使用 widget 特有的QWidget::createWindowContainer() 函数。
事件处理
通过QWindow::event() 和朋友,或通过QObject::installEventFilter() ,跨平台事件交付已充分涵盖了 Qt 中的大多数事件处理用例。
如果这还不够,Qt 还提供了对本地事件交付的访问。可以使用QCoreApplication::installNativeEventFilter() 安装一个接收所有本地事件的全局事件过滤器,而每个窗口的本地事件可在QWindow::nativeEvent() 中处理。
注意: 干扰本地事件流可能会使 Qt 处于不一致状态。这些 API 应主要用于增强 Qt 现有的事件处理功能,例如 Qt 尚未处理的事件。
本地接口
上述 API 未涵盖的平台特定功能由 Qt 中更通用的本地接口机制处理。接口提供了对其扩展类的本地或平台特定 API 的访问。
这些接口位于QNativeInterface 命名空间中,涵盖的用例包括访问底层本地句柄、采用现有本地句柄或提供平台特定 API。
例如,通过QNativeInterface::QCocoaGLContext 本地接口访问 macOS 上QOpenGLContext 的底层 NSOpenGLContext:
using namespace QNativeInterface; if (auto *cocoaGLContext = glContext->nativeInterface<QCocoaGLContext>()) [cocoaGLContext->nativeContext() makeCurrentContext];
有关所有本地接口的完整列表,请参阅本地接口概述。
警告: 本地接口 API 没有源代码或二进制兼容性保证,这意味着使用这些接口的应用程序只能保证在其开发时所使用的 Qt 版本上运行。
平台支持
除了应用程序开发人员 API 之外,Qt 在提供 Qt 跨平台构建模块的底层实现时,还提供了平台接口。
例如,Qt 中的事件派发器抽象和 Qt 中的渲染硬件抽象。 Qt Core中的事件派发器抽象和 RHI 中的渲染硬件抽象。
这里的主要抽象层是Qt 平台抽象,简称 QPA,它处理窗口系统集成和相关用例。
© 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.