Проблемы при подключении и отключении внешнего приложения от QDockWidget - PullRequest
0 голосов
/ 27 января 2019

Рассмотрим этот маленький кусочек кода:

import subprocess
import win32gui
import win32con
import time
import sys
from PyQt5.Qt import *  # noqa


class Mcve(QMainWindow):

    def __init__(self, path_exe):
        super().__init__()

        menu = self.menuBar()

        attach_action = QAction('Attach', self)
        attach_action.triggered.connect(self.attach)
        menu.addAction(attach_action)

        detach_action = QAction('Detach', self)
        detach_action.triggered.connect(self.detach)
        menu.addAction(detach_action)

        self.dock = QDockWidget("Attach window", self)
        self.addDockWidget(Qt.RightDockWidgetArea, self.dock)

        p = subprocess.Popen(path_exe)
        time.sleep(0.5)  # Give enough time so FindWindowEx won't return 0
        self.hwnd = win32gui.FindWindowEx(0, 0, "CalcFrame", None)
        if self.hwnd == 0:
            raise Exception("Process not found")

    def detach(self):
        try:
            self._window.setParent(None)
            # win32gui.SetWindowLong(self.hwnd, win32con.GWL_EXSTYLE, self._style)
            self._window.show()
            self.dock.setWidget(None)
            self._widget = None
            self._window = None
        except Exception as e:
            import traceback
            traceback.print_exc()

    def attach(self):
        # self._style = win32gui.GetWindowLong(self.hwnd, win32con.GWL_EXSTYLE)
        self._window = QWindow.fromWinId(self.hwnd)
        self._widget = self.createWindowContainer(self._window)
        self.dock.setWidget(self._widget)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Mcve("C:\\Windows\\system32\\calc.exe")
    w.show()
    sys.exit(app.exec_())

Цель здесь - исправить код, чтобы окно, присоединяющееся / отсоединяющееся к QDockWidget, было сделано правильно.На данный момент в коде есть 2 важных вопроса.

Issue1

Стиль оригинального окна облажался:

a) Перед подключением (калькулятор имеет строку меню)

enter image description here

b) При подключении (исчезла строка меню калькулятора)

enter image description here

c) При отсоединении (строка меню не была восстановлена ​​должным образом)

enter image description here

Я уже пробовал использовать qt-функции flags / setFlagsили getWindowLong / setWindowLong bit Мне не повезло со всеми моими попытками

Issue2

Если вы подключили и отключили калькулятор к главному окну, а затем решили закрыть главное окно, которое вам определенно нужновсе (процесс pyqt) должен быть закрыт и очищен должным образом, прямо сейчас этого не произойдет, почему?

Фактически, когда вы подключили / отсоединили калькулятор к главному окну, процесс Python будет удерживатьи вам нужно будет принудительно завершить процесс (например: ctrl + break conemu, ctrl + c cmd prompt) ... который указывает на то, что код не работает правильно при воспитании / отцовстве

Дополнительные примечания:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...