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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Два вопроса по программной прокрутке QScrollArea [Qt5]  (Прочитано 4155 раз)
Crazy Sage
Гость
« : Январь 25, 2018, 09:36 »

Приветствую.
Такой вопрос, есть у меня QScrollArea, в нём QVBoxLayout, в нём куча кнопок, кнопки создаются динамически, количество их меняется по ходу работы.
Код добавления кнопки
Код:
QToolButton* btn = new QToolButton(ui.previewList);
        btn->setCheckable(TRUE);
        ui.buttonsLayout->removeItem(ui.buttonsSpacer);
        ui.buttonsLayout->addWidget(btn);
        ui.buttonsLayout->addItem(ui.buttonsSpacer);

Мне надо иногда из программы прокручивать ScrollArea так, чтобы была видна одна из кнопок и тут начинаются проблемы.
1. ui.previewList->ensureWidgetVisible(btn) не даёт никакого эффекта вообще, видимо потому что кнопки принадлежат лэйауту, а не ему.
2. если я хочу прокрутить до самого конца, то все из нижеприведённых вариантов приводят к тому, что слайдер прокручивается так, что аккуратно последняя кнопка не видна (хотя я проверил, я вначале захожу в добавление кнопок, потом вызываю прокрутку, может надо ещё что-то сделать, чтобы принудительно заставить QScrollArea пересчитать свойства своего скроллбара?

Код:
//Вариант 1
ui.previewList->verticalScrollBar()->setValue(ui.previewList->verticalScrollBar()->maximum());
ui.previewList->verticalScrollBar()->triggerAction(QAbstractSlider::SliderMove);

//Вариант 2
ui.previewList->verticalScrollBar()->setValue(ui.previewList->verticalScrollBar()->maximum() + ui.previewList->verticalScrollBar()->pageStep());
ui.previewList->verticalScrollBar()->triggerAction(QAbstractSlider::SliderMove);

//Вариант 3
ui.previewList->verticalScrollBar()->triggerAction(QAbstractSlider::SliderToMaximum);

Как правильно сделать, чтобы подобная прокрутка работала?
Записан
Crazy Sage
Гость
« Ответ #1 : Январь 27, 2018, 12:21 »

Со второй проблемой я разобрался, надо было добавить processEvents перед прокруткой.
А вот как аккуратно решить первую, не занимаясь обработкой положения всех кнопок вручную как-то пока не понимаю.
Записан
Crazy Sage
Гость
« Ответ #2 : Январь 31, 2018, 13:58 »

C EnsureItemVisible тоже разобрался, недостаточно внимательно читал мануал, надо было внутреннему лэйауту поставить SizeConstraint SetMinAndMaxSize
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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