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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Анимация изменения геометрии виджета внутри QLayout  (Прочитано 3777 раз)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« : Май 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();
 
И всё бы ничего, но при этом лайаут сразу отрабатывает в части отображения пустого места под виджет и только потом внутри этого пустого места начинается выезжание моей панели. А вот как бы сделать так, чтобы и лейаут не резервировал всё пустое место сразу, а делал это синхронно с выездом виджета?
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Май 20, 2014, 11:04 »

Думаю  sizeHint придётся переопределить?
Или попробовать с fixed size по играться.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #2 : Май 20, 2014, 12:05 »

У меня размер виджета не меняется, меняется его верхняя координата. Пока не понял, как тут sizeHint или setFixedSize может помочь.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Май 20, 2014, 12:15 »

У меня размер виджета не меняется, меняется его верхняя координата. Пока не понял, как тут sizeHint или setFixedSize может помочь.
Layout узнает размер виджета из sizeHint. Для плавной анимации придётся каждый шаг обновлять layout, он будет заново запрашивать  размеры виджетов.
Мы можем переопределить sizeHint и возвращать нужные значения, или попробовать заставить возвращать нужные нам значения, устанавливая фиксированный размер через fixed size.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #4 : Май 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();
 
Ряд вещей тут мне не нравится (изменение размера, а не позиции виджета + фиксированный конечный размер), но на скорую руку пойдет.
« Последнее редактирование: Май 20, 2014, 13:09 от xokc » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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