来自 WinId 和 createWindowContainer 的 Python QT 函数在 Linux 上不工作

问题描述 投票:0回答:0

我正在使用 PySide2 在 Python 上开发一个 gui 应用程序。我正在使用 fromWinId 和 createWindowContainer 函数在我的应用程序中嵌入外部窗口应用程序。它在 Windows 上完美运行,我可以访问我的嵌入式应用程序(例如 Paint 应用程序)。但在 Linux 上,它的工作方式不同。我设法获取了外部应用程序的窗口 ID 并将其嵌入到我的应用程序中,但是当它被嵌入时,我只有外部应用程序的冻结图像。

这是我的代码:

import Xlib.display
from PySide2.QtGui import QWindow
from PySide2.QtWidgets import QWidget, QApplication, QPushButton, QMainWindow, QVBoxLayout


def _get_window_id_win32(title):
    import win32gui
    return win32gui.FindWindow(None, title)


def get_window_id_linux(name):
    display = Xlib.display.Display()
    root = display.screen().root
    window_ids =       root.get_full_property(display.intern_atom("_NET_CLIENT_LIST"), Xlib.X.AnyPropertyType).value
    for window_id in window_ids:
        window = display.create_resource_object("window", window_id)
        window_name = window.get_wm_name()
        if window_name and name in window_name:
            return window_id


def run_app(window_id):
    app = QApplication([])

    main = QMainWindow()
    widget_central = QWidget()
    layout = QVBoxLayout()

    button = QPushButton()
    button.setText('CLICK')
    layout.addWidget(button)

    window = QWindow.fromWinId(window_id)
    widget = QWidget.createWindowContainer(window)
    layout.addWidget(widget)

    widget_central.setLayout(layout)
    main.setCentralWidget(widget_central)
    main.show()

    app.exec_()


if __name__ == "__main__":
    window_id = get_window_id_linux("Window Title") # REPLACE 'Window Title' by the title of the window you want to embed
    # window_id = _get_window_id_win32('Window Title') IF YOU WANT TO TEST ON WINDOWS
    if window_id:
        run_app(window_id)
python qt pyside embedding
© www.soinside.com 2019 - 2024. All rights reserved.