2017-04-08 137 views
0

想法是,将QWidget弹出到它自己的QMainWindow中。事先它是窗口A的中心部件,然后A应该有一个填充部件,一个新的窗口B与部件一起产生作为它自己的中心部件。将QWidget从一个窗口移动到另一个窗口(在PyQt中)

因此,这里的设置:

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 

回答

0

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

对此有何解释?它看起来并不像预期的那样工作......

相关问题