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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Восстановить скроллы  (Прочитано 2638 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Май 31, 2016, 13:11 »

Добрый день

В QScrollArea вставлен виджет с лайаутом в котором сидят чайлд виджеты. Часто возникает ситуация когда проще удалить всех чайлдов и пере-создать их с нуля. И тут возникает мелкая неприятность: после пере-создания скроллы обнулены, для юзера "картинка улетела". Как их восстановить? (интим с таймером не предлагать!  Улыбающийся)

Спасибо
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Май 31, 2016, 15:29 »

Как-то так
Код
C++ (Qt)
void setUpdatesEnabled( bool set )
{
   sa->setUpdatesEnabled( set );
   sa->viewport()->setUpdatesEnabled( set );
   sa->horizontalScrollBar()->setUpdatesEnabled( set );
   sa->verticalScrollBar()->setUpdatesEnabled( set );
}
 
// save state
setUpdatesEnabled( false );
auto vsb = sa->verticalScrollBar();
auto hsb = sa->horizontalScrollBar();
int vsv = vsb->value();
bool vs_at_end = vsv > 0 && vsv == vsb->maximum();
int hsv = hsb->value();
bool hs_at_end = hsv > 0 && hsv == hsb->maximum();
 
// updating...
 
// save state
vsb->setValue( vs_at_end ? vsb->maximum() : vsv );
hsb->setValue( hs_at_end ? hsb->maximum() : hsv );
setUpdatesEnabled( true );
 
« Последнее редактирование: Май 31, 2016, 16:26 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июнь 01, 2016, 18:09 »

Как-то так
Код
C++ (Qt)
...
// updating...
...
 
Тут я не знаю какое updating Вы имели ввиду Улыбающийся У меня это удаление и пересоздание всех чайлд виджетов. Сразу после этого никакие установки скроллбаров не имеют эффекта, их range нулевой. Нужно выйти в событийный цикл и чего-то дождаться, а потом уже ставить значения. Подозреваю это "что-то"  = QEvent::LayoutRequest, но еще копаюсь..
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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