将 Qt 与其他 UI 工具包混合使用
Qt 提供了一套全面的跨平台 UI 组件和控件,可满足绝大多数应用程序开发需求。但在某些情况下,将 Qt 与其他 UI 工具包集成是必要的,或者会带来好处。
一种情况是将 Qt UI 嵌入到使用其他工具包构建的应用程序中,例如为现有应用程序实现插件,或者将 Qt 逐步引入现有的代码库。
另一种情况是在 Qt 应用程序中托管原生或第三方 UI 元素,例如为了使用 Qt 未提供的专用控件。
现在,我们将探讨解决这两个用例的不同方面。
外部窗口
要将 Qt 与其他 UI 工具包集成,首先需要该平台基本 UI 构建块的共享表示形式。在 Qt 中,这由WId 类型表示,这是一个不透明的句柄,每个平台都有自己对它映射到的本机类型的定义。
下一步是将该本机句柄封装为 Qt 可以交互的形式。我们基于 Qt 中的QWindow 抽象,通过创建本机句柄的QWindow 表示形式来实现这一点。
以这种方式创建的窗口在 Qt 中被称为“外部窗口”,因为它代表了一个由(对 Qt 而言)外部的 UI 工具包创建的控件。
注意:Qt 在创建外部窗口时不会对原生窗口句柄拥有(排他性)所有权,因此应用程序有责任在外部QWindow 的生命周期内保持原生窗口的存活。
现在,我们可以将 Qt UI 嵌入到这个外部窗口中,或者在我们的 Qt UI 中托管该外部窗口。
将 Qt 嵌入到其他 UI 工具包中
要将 Qt UI 嵌入到其他 UI 工具包中,我们使用该外部窗口作为 UI 的父窗口。
嵌入Qt Widgets
要嵌入 Qt Widgets UI,我们需要向小部件获取其window handle ,然后将其父窗口重新设置为该外部窗口。
QMainWindow *mainWindow = new QMainWindow;
mainWindow->windowHandle()->setParent(foreignWindow);嵌入Qt Quick
要嵌入Qt Quick 用户界面,我们可以直接将Quick视图的父窗口重新设置为该外部窗口。
QQuickView *quickView = new QQuickView;
quickView->setParent(foreignWindow);当没有父窗口句柄时
在某些情况下,我们可能无法访问原生父窗口句柄,而是被要求生成一个原生句柄,该句柄将在我们无法控制的情况下被重新关联。
由于没有父窗口的QWindow 通常是一个顶级窗口,因此我们需要首先通过添加Qt::SubWindow 标志,明确地告诉Qt该窗口将作为子窗口。
quickView->setFlags(quickView->flags() | Qt::SubWindow);QWidget QQuickView WId然后,我们通过
QWindow::winId() 向 xml-ph-0000@deepl.internal 或 xml-ph-0001@deepl.internal 请求其 xml-ph-0002@deepl.internal,然后返回该本机句柄以进行重新父窗口绑定。
return reinterpret_cast<NSView*>(quickView->winId());事件分发
Qt 依赖于能够定期处理事件和定时器,因此当将 Qt UI 集成到另一个 UI 工具包时,我们仍然需要一个QGuiApplication 。一种典型的模式是在首次构建 Qt UI 时创建应用程序实例,然后在确定 Qt UI 已被拆除时(例如在插件卸载期间)将其删除。
在 Qt 中托管其他 UI 工具包
要在 Qt 中托管其他 UI 工具包,需将外部窗口封装在 Qt Widgets 或Qt Quick 专用的窗口容器中。
在Qt Widgets
对于基于Qt Widgets UI栈构建的应用程序,我们通过QWidget::createWindowContainer()函数将QWindow 转换为QWidget 表示形式,随后即可像管理其他小部件一样对其进行管理,例如在布局中。
QWidget *hostedWidget = QWidget::createWindowContainer(foreignWindow);
layout->addWidget(hostedWidget);在Qt Quick
对于基于Qt Quick UI 栈构建的应用程序,我们将外部窗口暴露给 QQmlApplicationEngine,然后使用WindowContainer 项来管理该外部窗口。
engine.setInitialProperties({{ "foreignWindow", QVariant::fromValue(foreignWindow) }});ApplicationWindow {
required property QtObject foreignWindow;
WindowContainer {
window: foreignWindow
anchors.centerIn: parent
}
}有关此用例的详细信息,请参阅“窗口托管示例”。
特定于平台的解决方案
上述关于窗口嵌入和托管的基元应能满足大多数情况,但当需要更深层次的集成时,Qt 还提供了特定于平台的解决方案。
Active Qt 模块
Qt 对 ActiveX 和 COM 的支持使 Windows 上的 Qt 开发人员能够在 Qt 应用程序中访问和使用任何 ActiveX 服务器提供的 ActiveX 控件和 COM 对象,并将他们的 Qt 应用程序作为 COM 服务器提供,其中任意数量的 Qt 对象和控件均可作为 COM 对象和 ActiveX 控件使用。
请参阅 Active Qt 以获取更多信息。
© 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.