Динамическое позиционирование виджетов в PyQt5 - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу, чтобы у моего окна была такая раскладка:

График будет из 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 голосов
/ 28 сентября 2018

Первое, что вам нужно сделать, это спроектировать ваш проект, например, в вашем случае у вас есть два элемента, расположенных вертикально: красный 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().

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...