2017-04-08 1 views
0

L'idée est, de faire apparaître un QWidget dans son propre QMainWindow. Auparavant, c'est le widget central de la fenêtre A, et après A doit avoir un widget de remplissage, une nouvelle fenêtre B est engendrée avec le widget comme son propre widget central.Déplacer QWidget d'une fenêtre à l'autre (en PyQt)

Alors, voici la configuration:

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)) 

Mais quand je l'essaie, le DetachedWindow est tout simplement vide. Lorsque je remplace widget dans setCentralWidget avec le constructeur d'un QWidget, il s'affiche correctement. Mais pas avec le widget adopté.

Qu'est-ce qui me manque ici?

Mise à jour: Apparemment, le widget est supprimé. Lorsque vous accédez à la fonction setText d'un de ses étiquettes, l'erreur suivante se produit:

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

Répondre

0

Je ne sais pas pourquoi, mais appelant widget.show() résout ensuite la question.

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)) 

Une explication à cela? Il ne semble pas que cela fonctionne comme prévu ...