2017-10-19 96 views
0

我試圖在PyQt5中創建一個停靠的接口,創建一個包含我的各種小部件的BoxLayout,然後將此佈局應用於QDockWidget。在PyQt5中將佈局應用於QDockWidget

我的做法迄今已有:

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

如下我目前得到一個錯誤:

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

然而,在我上面的代碼,我不能看到我已經加入之前的佈局,並且在文檔中找不到任何內容來幫助我解決此問題。

我的方法在哪裏出錯了?

回答

1

QDockWidget已經有一個默認的佈局,使產生這個錯誤,正確的做法是添加一個空的窗口小部件,並在該窗口小部件的地方佈局你想要的:

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

例子:

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

屏幕截圖:

enter image description here