Russian Qt Forum
Март 28, 2024, 20:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGridLayout и setSizeConstraint - не уменьшается зона прокрутки  (Прочитано 3972 раз)
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, не пинайте сильно.
« Последнее редактирование: Апрель 29, 2017, 17:31 от str-ms » Записан
str-ms
Гость
« Ответ #1 : Апрель 29, 2017, 17:36 »

Мониторю высоту viewport. До уменьшения ширины поля - 850 пикселей. Уменьшаю ширину на одну колонку - становится 970. Расширяю обратно - становится 960 вместо 850 Грустный И, зараза, не даёт вручную ресайзом высоту поменять  Злой
« Последнее редактирование: Апрель 29, 2017, 17:56 от str-ms » Записан
str-ms
Гость
« Ответ #2 : Май 03, 2017, 09:35 »

Нашёл, в чём был косяк. Сам же устанавливал минимальную высоту строки  self.mainLayout.setRowMinimumHeight, и что-то в этой связке не работало как надо. Убрал эту строчку - грид сам разобрался и заработал как положено.
Спасибо форуму, поговоришь с умным человеком - сам поумнеешь  Показает язык
Тема закрыта.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 20.