【发布时间】:2019-11-30 15:20:25
【问题描述】:
我想在 Windows 中嵌入一个 Qt 应用程序(不是相反,因为许多其他问题已经得到解答)。为了澄清我有一个 win32 应用程序,我启动了一个 qt python 进程;这个 qt python 进程必须嵌入到 win32 应用程序中。如何才能做到这一点?在 QWindow::fromWinId 的 API 中,它明确指出:
“创建窗口的本地表示由另一个进程创建或使用 Qt 下面的本机库......”
"...这可以在支持它的平台上使用,将 QWindow 嵌入到本地窗口中,或将本地窗口嵌入到 QWindow 中。"
其次,QWidget::createWindowContainer 似乎只适用于在 Qt 中嵌入原生窗口(不是我想要的方式)。
我不确定如何在QWindow 中创建QWidget。从这个question 看来,方法似乎是用QWindow::fromWinId 创建一个QQuickView;但是,我似乎找不到如何将 QWidget 绑定到 QQuickView 中。
目前我实际上使用::SetParent 设置父级,但是那里有奇怪的消息传递协议要处理,所以我想尝试用 Qt 的方法重构它。
到目前为止编写的一些基本代码(PySide2,但 C++ 或任何其他带有 Qt 绑定的语言都可以):
app = QApplication(sys.argv)
hwnd = int(sys.argv[1], 16)
nativeParentWindow = QWindow.fromWinId(hwnd)
quickview = QQuickView(nativeParentWindow)
# this part is incorrect (tries to embed native window into qt)
# I want this application to run embedded inside hwnd
wrongWidget = QWidget.createWindowContainer(quickview)
wrongWidget.show()
sys.exit(app.exec_())
【问题讨论】:
-
基本上这不是很实用,正如您在调用 SetParent 时发现的那样。支持的方式是将所有 UI 代码驻留在同一进程中。
-
@DavidHeffernan 是的,这绝对是真的;但是,我仍然想知道这种技术在 Qt 方面是否可行。 Python 方面已经完成了很多工作,因此它可以为我节省大量资源,以便快速发布即将发布的新闻稿。
-
我认为让这项工作顺利进行的希望不大
-
这里有数百个问题来自人们努力使这项工作顺利进行。你发现了和其他人一样的问题。
-
Qt 并不是那么重要。问题在于底层系统级别。将 Qt 添加到混合中只会使困难更加严重。
标签: python c++ qt winapi pyside2