PyQt5, вызывающий qwidget.setMaximumHeight, приводит к исчезновению контента - PullRequest
1 голос
/ 23 апреля 2020

Код ниже работает так, как я ожидаю. Он создает очень длинную страницу, которая выходит за пределы экрана, заполненную виджетами. То, что я хотел бы достичь, это та же страница, но короче с полосой прокрутки. Кажется, достаточно просто. Закомментированная строка: self.topWidget.setMaximumHeight (500) достигает размера, когда я раскомментирую его, но весь контент исчезает. Почему эта строка дает такой результат и как мне это исправить? Лучший альтернативный подход также был бы интересен. Спасибо!

import sys
from PyQt5.QtWidgets import (QWidget, QLabel, QApplication, QCheckBox, QHBoxLayout,
                             QVBoxLayout, QGridLayout)
class Example(QWidget):

    def __init__(self, labels):
        super().__init__()
        self.labels = labels

        self.topWidget = QWidget()
        self.vbox = QVBoxLayout()
        self.topWidget.setLayout(self.vbox)

        self.topgrid = QGridLayout()
        self.topgrid.addWidget(self.topWidget)
        self.setLayout(self.topgrid)

        self.initUI()
        self.show()

    def initUI(self):

        for i, t in enumerate(self.labels):
            widget = QWidget()
            widget.setMaximumHeight(40)
            hlayout = QHBoxLayout()
            lab = QLabel(t)
            lab.setMinimumWidth(self.maxWidth(self.labels) * 6 + 30)

            hlayout.addWidget(lab)
            hlayout.addWidget(QCheckBox("activate"))
            widget.setLayout(hlayout)
            self.vbox.addWidget(widget)

        # self.topWidget.setMaximumHeight(500)

        self.setWindowTitle('Dynamic layout')

    def maxWidth(self, arr):
        mWidth = 0
        for a in arr:
            mWidth = max(len(a), mWidth)
        return mWidth


if __name__ == '__main__':
    app = QApplication(sys.argv)
    labs = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',]
    ex = Example(labs)
    sys.exit(app.exec_())

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Объяснение:

Чтобы лучше понять явление, необходимо изменить максимальную высоту, например, с 2800 получается следующее:

enter image description here

Как видите, каждый виджет имеет одинаковую высоту, поскольку виджеты похожи, и QVBoxLayout установит одинаковую высоту для каждого элемента, и если эта высота меньше необходимой, то будет показана только часть. Если вычисление выполняется с максимальным значением высоты 500 для 90 виджетов с интервалом в 6 пикселей, то получается (500 - (89 + 1 + 1) * 6) / 90 = -0.5, что эквивалентно 0, и, следовательно, виджеты не наблюдаются.

Решение:

Даже когда виджеты отображаются, полоса прокрутки волшебным образом не отображается. Решение состоит в том, чтобы использовать QScrollArea, который реализует эту функциональность.

class Example(QWidget):
    def __init__(self, labels):
        super().__init__()
        self.labels = labels

        self.topWidget = QScrollArea(widgetResizable=True)

        self.topgrid = QGridLayout(self)
        self.topgrid.addWidget(self.topWidget)

        self.initUI()
        self.show()

    def initUI(self):

        content_widget = QWidget()
        vbox = QVBoxLayout(content_widget)
        self.topWidget.setWidget(content_widget)

        for i, t in enumerate(self.labels):
            widget = QWidget()
            hlayout = QHBoxLayout(widget)

            lab = QLabel(t)
            hlayout.addWidget(lab)
            hlayout.addWidget(QCheckBox("activate"))

            vbox.addWidget(widget)

        self.setWindowTitle("Dynamic layout")

enter image description here

0 голосов
/ 23 апреля 2020

Я немного переработал ваш код, чтобы вы могли сделать его прокручиваемым.

import sys
from PyQt5.QtWidgets import (QWidget, QLabel, QApplication, QCheckBox, QHBoxLayout,
                             QVBoxLayout, QGroupBox, QGridLayout, QFormLayout, QScrollArea)
from PyQt5.QtCore import Qt, pyqtSignal, QSize, QRect
class Example(QWidget):

    def __init__(self, labels):
        super().__init__()
        self.labels = labels

        self.topWidget = QWidget()
        self.vbox = QVBoxLayout()
        self.topWidget.setLayout(self.vbox)

        self.topgrid = QGridLayout()
        self.topgrid.addWidget(self.topWidget)
        self.setLayout(self.topgrid)

        self.initUI()
        self.show()

    def initUI(self):
        groupBox = QGroupBox("This Is Group Box")
        label_list = []
        checkbox_list = []
        formLayout =QFormLayout()
        for i, t in enumerate(self.labels):
            lab = QLabel(t)
            lab.setMinimumWidth(self.maxWidth(self.labels) * 6 + 30)

            label_list.append(lab)
            checkbox_list.append(QCheckBox("activate"))
            formLayout.addRow(label_list[i], checkbox_list[i])

        groupBox.setLayout(formLayout)
        scroll = QScrollArea()
        scroll.setWidget(groupBox)
        scroll.setWidgetResizable(True)
        scroll.setFixedHeight(400)
        self.vbox.addWidget(scroll)
        self.show()

        self.setWindowTitle('Dynamic layout')

    def maxWidth(self, arr):
        mWidth = 0
        for a in arr:
            mWidth = max(len(a), mWidth)
        return mWidth


if __name__ == '__main__':
    app = QApplication(sys.argv)
    labs = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',]
    ex = Example(labs)
    sys.exit(app.exec_())



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