【发布时间】:2021-05-22 12:02:12
【问题描述】:
我试图在我的 PyQt5 应用程序中显示另一个进程窗口。因为我在 Linux 上工作,所以我有这个 python gist 与 x11 一起工作。我将代码更改为从 PID 中获取,然后忙着等到窗口打开并使用 subprocess.Popen 启动程序
但是,这种方法存在一些问题:
它有点不稳定。有时它无法抓取窗口,我认为这与在启动时直接从QSettings 恢复布局有关。
我收到以下错误消息:
qt.qpa.xcb: QXcbConnection: XCB error: 3 (BadWindow), sequence: 2577, resource id: 127926283, major code: 18 (ChangeProperty), minor code: 0
qt.qpa.xcb: QXcbConnection: XCB error: 3 (BadWindow), sequence: 2578, resource id: 127926283, major code: 12 (ConfigureWindow), minor code: 0
什么意思?
但是,如果它不依赖于平台,我会接受不稳定的解决方案!我希望有一个独立于平台的解决方案,至少适用于 Linux 和 Windows。我猜在我的 PyQt5 应用程序中使用 xlib 会将它绑定到 Linux 上。那么下一个问题是否有一种独立于平台的方式来显示在我的 PyQt5 应用程序中使用 SDL2 的第三方应用程序?我不确定,但也许在我的应用程序中嵌入 xserver 是一种解决方案,但我对 xserver 了解不多,我认为这不是一件容易的事。
理想的解决方案将完全用 Python 编写(如果没有其他方法,也可以用 C++ 编写),但由于第三方应用程序是开源的 (C++),我可以重写应用程序以支持成为平台由 PyQt5 独立抓取。这会很不方便,因为我无法使用预构建的二进制文件,但如果这是唯一的方法,只要付出合理的努力,我就会接受。我的即时想法是通过 SDL 获取窗口 ID 并以某种方式将其发送到我的应用程序。我的研究没有产生任何关于如何做到这一点和my attempt 使用的结果
SDL_GetWindowID(SDL_Window * window);
失败了,因为很快我(我想我)发现它返回的是 SDL 实习生窗口 ID,而不是操作系统 WID。所以我的问题是:如何从 SDL 获取 Window ID?或者如何让我的 PyQt5 应用抓取它的窗口?
也许最好的(也是最困难的)解决方案是重写开源应用程序,以在 QWindow 中显示其内容并将此 ID 发送过来,但我不知道如何处理,也不知道如何链接这个应用程序与 qt。也许在这一点上值得注意的是,我对 Qt 还很陌生,这就是我使用 PyQt5 的原因。
【问题讨论】:
-
您指出:我的研究没有产生任何关于如何做到这一点以及我尝试使用的结果...,您能否提供minimal reproducible example 的内容你指向
-
我尝试过的最小示例已经给出。
SDL_GetWindowID(SDL_Window * window);在窗口句柄上返回2并尝试使用xprop - id 2获取窗口信息导致错误。这个oneliner是否需要一个可重现的例子? -
不,我想要一个可以执行和重现的代码
-
那么您认为 SDL_GetWindowID 应该返回当前操作系统的实际 WindowID 吗? e. G。 X11 WID?
-
是的,在 C++ 中它可以工作
标签: python pyqt5 cross-platform embed sdl-2