gpt4 book ai didi

python - 从 QDockWidget 附加和分离外部应用程序时的问题

转载 作者:行者123 更新时间:2023-12-03 07:26:33 26 4
gpt4 key购买 nike

考虑一下这段代码:

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 中。现在,代码有两个重要问题。
问题1
原来 window 的风格搞砸了:
a) 连接前(计算器有菜单栏)
enter image description here
b) 附加后(计算器菜单栏不见了)
enter image description here
c) 分离时(菜单栏未正确恢复)
enter image description here
我已经尝试过使用 flags/setFlags qt 函数或 getWindowLong/setWindowLong 但我的所有尝试都没有成功
问题2
如果您已将计算器附加和分离到主窗口,然后您决定关闭主窗口,那么您肯定希望所有内容(pyqt 进程)都被正确关闭和清理。现在不会了,为什么?
事实上,当您将计算器附加/分离到主窗口时,python 进程将保持,您需要手动强制终止进程(即 ctrl+break conemu、ctrl+c cmd 提示符)...这表明代码在育儿/育儿时没有正确做事
附加说明:
  • http://doc.qt.io/qt-5/qwindow.html#fromWinId
  • http://doc.qt.io/qt-5/qwidget.html#createWindowContainer
  • 在上面的最小代码中,我将 calc.exe 作为子进程生成,但您可以假设 calc.exe 是一个现有的非子进程,例如 explorer.exe
  • 最佳答案

    我发现部分问题需要关闭。因此,当您创建 self._window 时在 attach功能,然后关闭 MainWindow ,另一个窗口(线程)静止不动。所以如果你添加一个 self._window = None__init__函数并添加一个 __del__功能如下,那部分是固定的。仍然不确定缺少菜单。我还建议使用 self.__p 保持子进程句柄而不是只是放手。将其包含在 __del__ 中以及。

        def __del__(self):
    self.__p.terminate()
    if self._window:
    print('terminating window')
    self._window.close
    可能更好的是包含 closeEvent
        def closeEvent(self, event):
    print('Closing time')
    self.__p.terminate()
    if self._window is not None:
    print('terminating window')
    self._window.close

    关于python - 从 QDockWidget 附加和分离外部应用程序时的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54388685/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com