在PyQt5中为QDockWidget应用布局

6
我将尝试在PyQt5中创建一个停靠接口,创建一个BoxLayout来包含我的各种小部件,然后将这个布局应用于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个回答

8

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

屏幕截图:

在此输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接