Рассмотрим этот маленький кусочек кода:
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) Перед подключением (калькулятор имеет строку меню)
b) При подключении (исчезла строка меню калькулятора)
c) При отсоединении (строка меню не была восстановлена должным образом)
Я уже пробовал использовать qt-функции flags / setFlagsили getWindowLong / setWindowLong bit Мне не повезло со всеми моими попытками
Issue2
Если вы подключили и отключили калькулятор к главному окну, а затем решили закрыть главное окно, которое вам определенно нужновсе (процесс pyqt) должен быть закрыт и очищен должным образом, прямо сейчас этого не произойдет, почему?
Фактически, когда вы подключили / отсоединили калькулятор к главному окну, процесс Python будет удерживатьи вам нужно будет принудительно завершить процесс (например: ctrl + break conemu, ctrl + c cmd prompt) ... который указывает на то, что код не работает правильно при воспитании / отцовстве
Дополнительные примечания: