Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xokc от Май 20, 2014, 11:01



Название: Анимация изменения геометрии виджета внутри QLayout
Отправлено: xokc от Май 20, 2014, 11:01
Есть у меня информационная панель внутри QVerticalLayout, которая появляется по мере необходимости для вывода информации (типа того, как в браузерах сообщают о блокированных popup окнах). Захотелось мне, чтобы она "выезжала" с анимацией:
Код
C++ (Qt)
 
   ui->infoPanel->show();
   QRect r = ui->infoPanel->rect();
   QPropertyAnimation *animation = new QPropertyAnimation(ui->infoPanel, "geometry");
   animation->setDuration(250);
   animation->setStartValue(r.translated(0, -r.height()));
   animation->setEndValue(r);
   animation->start();
 
И всё бы ничего, но при этом лайаут сразу отрабатывает в части отображения пустого места под виджет и только потом внутри этого пустого места начинается выезжание моей панели. А вот как бы сделать так, чтобы и лейаут не резервировал всё пустое место сразу, а делал это синхронно с выездом виджета?


Название: Re: Анимация изменения геометрии виджета внутри QLayout
Отправлено: Old от Май 20, 2014, 11:04
Думаю  sizeHint придётся переопределить?
Или попробовать с fixed size по играться.


Название: Re: Анимация изменения геометрии виджета внутри QLayout
Отправлено: xokc от Май 20, 2014, 12:05
У меня размер виджета не меняется, меняется его верхняя координата. Пока не понял, как тут sizeHint или setFixedSize может помочь.


Название: Re: Анимация изменения геометрии виджета внутри QLayout
Отправлено: Old от Май 20, 2014, 12:15
У меня размер виджета не меняется, меняется его верхняя координата. Пока не понял, как тут sizeHint или setFixedSize может помочь.
Layout узнает размер виджета из sizeHint. Для плавной анимации придётся каждый шаг обновлять layout, он будет заново запрашивать  размеры виджетов.
Мы можем переопределить sizeHint и возвращать нужные значения, или попробовать заставить возвращать нужные нам значения, устанавливая фиксированный размер через fixed size.


Название: Re: Анимация изменения геометрии виджета внутри QLayout
Отправлено: xokc от Май 20, 2014, 12:38
Это-то понятно. Только вот при таком решении будет изменяться и собственно размер моего виджета, а этого не хотелось-бы: там внутри несколько чувствительных к его высоте контролов, которые искажаются при изменении высоты. То есть ещё придется городить дополнительный parent контейнер, а внутри него еще добавлять по-сути собственный лайоут, который будет адекватно двигать мою панель. Как-то сложно выходит. Тут уж проще сразу писать самодельный QAnimatedLayout.
Попроще решение никто не предложит?

В общем, сделал пока так:
Код
C++ (Qt)
   QPropertyAnimation *animation = new QPropertyAnimation(ui->infoPanel, "maximumHeight");
   animation->setDuration(1000);
   animation->setStartValue(0);
   animation->setEndValue(50);
   animation->start();
 
Ряд вещей тут мне не нравится (изменение размера, а не позиции виджета + фиксированный конечный размер), но на скорую руку пойдет.