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

Move QWidget from one window to another (in PyQt)

这个想法是,将 QWidget 弹出到它自己的 QMainWindow 中。之前它是 window A 的中心小部件,之后 A 应该有一个填充小部件,一个新的 window 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 只是空的。当我用 QWidget 的构造函数替换 setCentralWidget 中的 widget 时,它会正确显示。但不适用于采用的小部件。

我在这里错过了什么?

更新: 显然这个插件被删除了。访问其中一个标签的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))

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