Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Май 31, 2016, 13:11



Название: Восстановить скроллы
Отправлено: Igors от Май 31, 2016, 13:11
Добрый день

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

Спасибо


Название: Re: Восстановить скроллы
Отправлено: GreatSnake от Май 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 );
 


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