2017-10-19 7 views
0

J'essaie de créer une interface ancrée dans PyQt5, en créant un BoxLayout en continuant mes divers widgets, puis en appliquant cette disposition au QDockWidget.Application d'une disposition à un QDockWidget dans PyQt5

Mon approche a donc été loin:

self.layout = QtWidgets.QBoxLayout(2) 
self.layout.addWidget(self.widget_one) 
self.layout.addWidget(self.widget_two) 
self.docked = QtWidgets.QDockWidget() 
self.docked.setLayout(self.layout) 
self.docked.show() 

Je reçois actuellement une erreur comme suit:

QWidget::setLayout: Attempting to set QLayout "" on QDockWidget "", 
which already has a layout 

Cependant, dans mon code ci-dessus, je ne peux pas voir où j'ai ajouté une mise en page précédemment, et ne trouve rien dans la documentation pour m'aider à résoudre ce problème.

Où est-ce que je me suis trompé dans mon approche?

Répondre

1

QDockWidget ont déjà une mise en page par défaut afin que génère cette erreur, la bonne chose est d'ajouter un widget vide et à cet endroit widget la mise en page que vous voulez:

self.layout = QtWidgets.QBoxLayout(2) 
self.layout.addWidget(self.widget_one) 
self.layout.addWidget(self.widget_two) 
self.docked = QtWidgets.QDockWidget() 
self.dockedWidget = QtWidgets.QWidget() 
self.docked.setWidget(self.dockedWidget) 
self.dockedWidget.setLayout(self.layout) 
self.docked.show() 

Exemple:

class DockDemo(QMainWindow): 
    def __init__(self, parent=None): 
     super(DockDemo, self).__init__(parent) 
     self.setCentralWidget(QTextEdit()) 

     self.docked = QDockWidget("Dockable", self) 
     self.addDockWidget(Qt.LeftDockWidgetArea, self.docked) 
     self.dockedWidget = QWidget(self) 
     self.docked.setWidget(self.dockedWidget) 
     self.setWindowTitle("Dock demo") 
     self.dockedWidget.setLayout(QVBoxLayout()) 
     for i in range(5): 
      self.dockedWidget.layout().addWidget(QPushButton("{}".format(i))) 


if __name__ == '__main__': 
    import sys 
    app = QApplication(sys.argv) 
    ex = DockDemo() 
    ex.show() 
    sys.exit(app.exec_()) 

Capture d'écran:

enter image description here