【问题标题】:Move QWidget from one window to another (in PyQt)将 QWidget 从一个窗口移动到另一个窗口(在 PyQt 中)
【发布时间】:2017-04-08 10:44:49
【问题描述】:

这个想法是,将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 只是空的。当我用QWidget 的构造函数替换setCentralWidget 中的widget 时,它会正确显示。但不是采用采用的小部件。

我在这里错过了什么?

更新:显然小部件已被删除。访问其标签之一的setText函数时,出现如下错误:

RuntimeError: wrapped C/C++ object of type QLabel has been deleted

【问题讨论】:

    标签: python qt pyqt qt5 qwidget


    【解决方案1】:

    我不知道为什么,但之后调用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))
    

    对此有何解释?这似乎并不像预期的那样工作......

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 2023-03-24
      • 2013-10-11
      • 1970-01-01
      • 2019-02-09
      • 2021-05-09
      • 1970-01-01
      相关资源
      最近更新 更多