【问题标题】:Dynamic positioning of widgets in PyQt5?PyQt5中小部件的动态定位?
【发布时间】:2018-10-12 03:24:30
【问题描述】:

我希望我的窗口具有这种布局:

图表将来自 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 的新手,在查看多个示例后不确定盒子布局如何工作。有没有更简单的方法可以在不影响布局的情况下做到这一点? 谢谢!

【问题讨论】:

  • 你说:图表将来自 matplotlib。我想要一种动态创建此布局的方法我没有看到任何来自 matplolib 的代码

标签: python python-3.x pyqt pyqt5


【解决方案1】:

您要做的第一件事是设计您的项目,例如,在您的情况下,您有两个垂直放置的元素:红色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() 的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2021-12-29
    • 1970-01-01
    相关资源
    最近更新 更多