在PyQt5中动态放置小部件?

时间:2018-09-28 20:00:40

标签: python python-3.x pyqt pyqt5

我希望我的窗口具有以下布局:

该图将来自matplotlib。 我想要一种动态创建此布局的方法,以使其适合任何尺寸的屏幕,而无需更改基本布局。我该怎么做呢?这是到目前为止我得到的:

import sys
from PyQt5.QtWidgets import (QWidget, QPushButton, 
    QHBoxLayout, QVBoxLayout, QApplication, QFrame, QScrollArea, QListWidget, QListWidgetItem, QLabel)

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):

        #top left downwards
        vbox = QVBoxLayout() 
        vbox.addStretch(1)
        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addLayout(vbox)
        hbox.setDirection(1)
        self.setLayout(hbox)    

        qlist = QListWidget()
        hbox.addWidget(qlist)

        for i in range(0,31):
            qlist.addItem(str(i)) 

        qlist.setFrameStyle(QFrame.Raised)

        vbox2 = QVBoxLayout()
        vbox2.addStretch()

        graph = QFrame(self)
        graph.setStyleSheet("QWidget { background-color: red }" )

        vbox2.addWidget(graph)
        graph.setFrameShape(1)

        self.setStyleSheet("font: 20pt Cambria")
        self.showMaximized()   
        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

哪个给我这个:

有人知道该怎么做吗?我是PyQt5的新手,在查看多个示例后不确定框布局如何工作。有没有一种更简单的方法可以在不影响布局的情况下做到这一点? 谢谢!

1 个答案:

答案 0 :(得分:0)

要做的第一件事就是设计项目,例如,您有两个垂直放置的元素:红色的QFrame和下面的东西,下面的东西命令一个元素处理水平位置,以便它下面必须是QHBoxLayout,放置QFrame并在其下面的元素必须是QVBoxLayout,这是您可以使用以下方案表示的简单结构

QWidget
└── QVBoxLayout
    ├── QFrame
    └── QHBoxLayout
        └── QListWidget (with stretch = 1)

我更喜欢先创建小部件,最后将其添加到各自的布局中。

import sys
from PyQt5 import QtWidgets

class Example(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # create widgets
        graph = QtWidgets.QFrame()
        graph.setFixedHeight(40)
        graph.setFrameShape(QtWidgets.QFrame.Box)
        graph.setStyleSheet("QWidget { background-color: red }" )

        qlist = QtWidgets.QListWidget()
        qlist.setFrameStyle(QtWidgets.QFrame.Raised)
        qlist.addItems(map(str, range(31)))

        # create QHBoxLayout and add QListWidget
        hlay = QtWidgets.QHBoxLayout()
        hlay.addWidget(qlist)
        hlay.addStretch(1)

        # create QVBoxLayout and add QFrame and QHBoxLayout
        vlay = QtWidgets.QVBoxLayout(self)
        vlay.addWidget(graph)
        vlay.addLayout(hlay) 

        self.setStyleSheet("font: 20pt Cambria")
        self.showMaximized()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

注意QFrame的高度不高,因为它的任务是承担内容的任务,在这种情况下,QFrame并没有一定的高度,因此我们必须确定一个固定的大小,如果您要向setFixedHeight()添加元素,请通过布局进行操作,并删除base的行。

enter image description here