Код ниже работает так, как я ожидаю. Он создает очень длинную страницу, которая выходит за пределы экрана, заполненную виджетами. То, что я хотел бы достичь, это та же страница, но короче с полосой прокрутки. Кажется, достаточно просто. Закомментированная строка: 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_())