Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: str-ms от Апрель 29, 2017, 17:22



Название: QGridLayout и setSizeConstraint - не уменьшается зона прокрутки
Отправлено: str-ms от Апрель 29, 2017, 17:22
Привет мастерам Qt!  ;)
Мучаю Qt из-под Питона, наткнулся на непонятную бяку. Сделал такой вот бутерброд: в окно класса QWidget  загнал QScrollArea, в неё QGridLayout, а в него уже в цикле кидаю QLabel. Смысл сего действа - вывести картинки стройными рядами, как иконки в проводнике. И при ресайзе окна приложения количество колонок должно автоматом меняться, при уменьшении ширины должна вырастать высота зоны прокрутки, при увеличении - сжиматься. Откройте проводник, там всё очевидно.
Код:
        self.mainLayout = QGridLayout()
        self.mainLayout.setSpacing(self.picSpacing)
        self.mainLayout.setSizeConstraint(QLayout.SetFixedSize)

        self.viewport = QWidget()
        self.viewport.setLayout(self.mainLayout)

        self.scrollArea = QScrollArea()
        self.scrollArea.setBackgroundRole(QPalette.Dark)
        self.scrollArea.setWidget(self.viewport)
        self.scrollArea.setWidgetResizable(True)

        layout = QVBoxLayout()
        layout.addWidget(self.scrollArea)
        self.setLayout(layout)
... Тут цикл по картинкам накидывает кучу Qlabel рядами
             self.pixmapLabels.append(self.createPixmapLabel(k))
             self.mainLayout.addWidget(self.pixmapLabels[k], k // self.curColumns, k % self.curColumns)

В общем всё вроде получается, ресайз красиво отрабатывает, ряды картинок я перестраиваю. Но есть одно НО, и заключается оно в параметре грида SizeConstraint. Он определяет поведение виджетов на QGridLayout при ресайзе. Если я его отключаю - картинки наезжают на верхние ряды, выравнивать их приходится через setSpacing нереальными значениями (вместо 10 приходится ставить (10 + высота картинки). Это бред, фиг просчитаешь высоту зоны прокрутки. Если ставлю фиксированный SizeConstraint - перестройка грида отлично отрабатывает, картинки строго по сетке, шик. Но если уменьшить ширину окна, чтобы они выстроились в один-два ряда - зона прокрутки становится узкой и высокой. А потом обратно расширяешь окно - грид перестраивается, но высота зоны прокрутки не уменьшается. Вверху висят картинки, а внизу - пустое место, которого быть не должно.
Грид я перестраиваю повторным вызовом addWidget для каждого QLabel с новыми координатами.
Есть у кого-то мысли, как победить этот глюк? Или я что-то делаю не так? Я новичок и в Питоне, и в Qt, не пинайте сильно.


Название: Re: QGridLayout и setSizeConstraint - не уменьшается зона прокрутки
Отправлено: str-ms от Апрель 29, 2017, 17:36
Мониторю высоту viewport. До уменьшения ширины поля - 850 пикселей. Уменьшаю ширину на одну колонку - становится 970. Расширяю обратно - становится 960 вместо 850 :( И, зараза, не даёт вручную ресайзом высоту поменять  >:(


Название: Re: QGridLayout и setSizeConstraint - не уменьшается зона прокрутки
Отправлено: str-ms от Май 03, 2017, 09:35
Нашёл, в чём был косяк. Сам же устанавливал минимальную высоту строки  self.mainLayout.setRowMinimumHeight, и что-то в этой связке не работало как надо. Убрал эту строчку - грид сам разобрался и заработал как положено.
Спасибо форуму, поговоришь с умным человеком - сам поумнеешь  :P
Тема закрыта.