将QWidget从一个窗口移动到另一个窗口(在PyQt中)



这个想法是,将QWidget弹出到它自己的QMainWindow中。事先它是窗口 A 的中心小部件,之后 A 应该有一个填充小部件,一个新的窗口 B 被生成,小部件作为它自己的中心小部件。

所以这是设置:

class DetachedWindow(QtWidgets.QMainWindow):
    def __init__(self, window: "MyMainWindow", widget: QtWidgets.QWidget = None, *args):
        QtWidgets.QMainWindow.__init__(self, *args)
        self.main_window = window
        window.set_widget(EmptyWidget(), False)  # sets new filler central widget
        if widget is not None:
            self.setCentralWidget(widget)
            widget.setParent(self)
        self.show()
class MyMainWindow(QtWidgets.QMainWindow):
    # ...
    def detach_screen(self):
        self.windows.append(DetachedWindow(self, self.current_widget))

但是当我尝试时,DetachedWindow只是空的。当我将setCentralWidget中的widget替换为QWidget的构造函数时,它会正确显示。但不是采用的小部件。

我在这里错过了什么?

更新:显然小部件已删除。访问其中一个标签的setText函数时,会发生以下错误:

RuntimeError: wrapped C/C++ object of type QLabel has been deleted
我不知道

为什么,但事后调用widget.show()可以解决问题。

class DetachedWindow(QtWidgets.QMainWindow):
    def __init__(self, window: "MyMainWindow", widget: QtWidgets.QWidget = None, *args):
        QtWidgets.QMainWindow.__init__(self, *args)
        self.main_window = window
        window.set_widget(EmptyWidget(), False)  # sets new filler central widget
        self.show()
        if widget is not None:
            self.setCentralWidget(widget)
            widget.setParent(self)
            widget.show()
class MyMainWindow(QtWidgets.QMainWindow):
    # ...
    def detach_screen(self):
        self.windows.append(DetachedWindow(self, self.current_widget))

对此有什么解释吗?这似乎并没有按预期工作...

最新更新