平台集成
作为一款用于应用程序开发的跨平台工具包,Qt 的主要优势在于无需为每个目标平台重复编写应用程序代码。
虽然 Qt 解决了编写应用程序的许多典型任务,但总会有一些 Qt 无法覆盖的特殊情况,或者在某些情况下,基于特定平台的 API 或其他工具包来构建功能更为合理。
为了支持这些用例,同时仍允许 Qt 处理大部分应用程序逻辑,Qt 提供了广泛的平台集成 API,从简单的类型转换到特定平台的原生接口,不一而足。
类型转换
许多 Qt 的基本数据类型,例如QString 、QPoint 或QImage ,都提供了与原生等效类型之间的转换。
例如,要在 Apple 平台上获取当前用户的用户名:
NSProcessInfo *processInfo = NSProcessInfo.processInfo;
QString userName = QString::fromNSString(processInfo.userName)有关所有类型转换的完整列表,请参阅“类型转换”概述。
与其他 UI 工具包集成
Qt 提供了一套全面的跨平台 UI 组件和控件,可满足绝大多数应用程序开发需求。但在某些情况下,将 Qt 与其他 UI 工具包集成是必要的或有益的。
一种情况是将 Qt UI 嵌入到使用其他工具包构建的应用程序中,例如在为现有应用程序实现插件时,或者在现有代码库中逐步引入 Qt 时。
另一种情况是在 Qt 应用程序中托管原生或第三方 UI 元素,例如为了使用 Qt 未提供的专用控件。
请参阅《将 Qt 与其他 UI 工具包混合使用》,深入了解 Qt 如何支持这两种用例。
事件处理
Qt 中大多数事件处理用例都可以通过跨平台事件传递得到充分满足,方法包括使用 `QWindow::event()` 及其相关函数,或者通过 `QObject::installEventFilter()`。
如果这些还不够,Qt XML 还提供了访问原生事件传递的功能。可以使用QCoreApplication::installNativeEventFilter() 安装一个接收所有原生事件的全局事件过滤器,而每个窗口的原生事件则可以在QWindow::nativeEvent() 中进行处理。
注意:干扰原生 事件流可能会导致 Qt 处于不一致状态。这些 API 主要应用于补充 Qt 现有的事件处理功能,例如处理 Qt 尚未处理的事件。
原生接口
上述 API 未涵盖的特定于平台的功能,由 Qt中更通用的原生接口机制处理。这些接口提供了对其所继承类的原生或特定于平台的 API 的访问权限。
这些接口位于QNativeInterface 命名空间中,涵盖了访问底层原生句柄、采用现有原生句柄或提供平台特定API等用例。
例如,要在 macOS 上通过 `QNativeInterface::QCocoaGLContext ` 本机接口访问 `QOpenGLContext ` 的底层 `NSOpenGLContext`:
using namespace QNativeInterface;
if (auto *cocoaGLContext = glContext->nativeInterface<QCocoaGLContext>())
[cocoaGLContext->nativeContext() makeCurrentContext];有关所有原生接口的完整列表,请参阅“原生接口概述”。
警告: 对于原生接口 API,不提供 源代码或二进制兼容性保证,这意味着使用这些接口的应用程序仅保证与开发时所基于的 Qt 版本兼容。
平台支持
除了应用程序开发者 API 之外,Qt 在提供其跨平台构建模块的基础实现时,也会与平台进行交互。
例如,RHI 中的事件分发器抽象 Qt Core 中的事件分发器抽象,以及 RHI 中的渲染硬件抽象。
这里的主要抽象层是Qt 平台抽象(Qt Platform Abstraction,简称 QPA),它负责窗口系统集成和相关用例。
© 2026 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.