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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Анимированные layout (4.6)  (Прочитано 10290 раз)
SpiritFire
Гость
« : Декабрь 18, 2009, 16:54 »

Скажите пожалуйста, есть ли возможность добавить анимацию к элементам, размеры и положение которых управляются layout-ом?

При беглом знакомстве анимацию-то добавить удалось, но работает она только в случае перемещения виджета из-за смены его состояния. Лейауты состояния не гоняют (что вполне логично) следовательно, анимации нет.

С другой стороны видел на ютубе что-то очень похожее на flow layout, с анимацией, к сожалению не могу дать линк - на работе мегоодмин запретил ютубы и подобные "баловства".

Добавлено потом: тыц -> http://www.youtube.com/watch?v=eJcTBJaPRZg
« Последнее редактирование: Декабрь 18, 2009, 17:02 от SpiritFire » Записан
niXman
Гость
« Ответ #1 : Декабрь 18, 2009, 18:06 »

для это есть Animation Framework
Записан
SpiritFire
Гость
« Ответ #2 : Декабрь 18, 2009, 18:29 »

для это есть Animation Framework
Благодарю, ваша помощь неоценима.
Как видно из моего предыдущего поста - я знаю о существовании Animation Framework. Более того, я достаточно подробно изучил документацию по нему и постепенно прихожу к выводу о том, что скорее всего, лейауты не поддерживают анимацию.

Уточню вопрос:
1. Скажите пожалуйста, прав ли я, что невозможно к стандартным лейаутам прикрутить анимацию, кроме изврещений, за использование которых нужно отбивать руки сочинителям.

2. Если я не прав, подскажите пожалуйста, куда копать в сторону интеграции лейаутов и анимации.

3. Что требуется: при изменении размера формы дочерние элементы плавно "ехают" на новое место.
Записан
Dendy
Гость
« Ответ #3 : Декабрь 18, 2009, 18:34 »

Думаю для этого нужно унаследоваться от QLayout и по таймеру возить окна по родителю.
Записан
SpiritFire
Гость
« Ответ #4 : Декабрь 18, 2009, 19:16 »

Думаю, да. Пришел к выводу о том, что стандартные лейауты изменяют свойства "размер" и "позиция" используя невиртуальные методы QWidget::resize, QWidget::move. При этом свойство менется мгновенно. Для того, чтобы оно менялось не мгновенно (с анимацией), есть насколько вариантов - менять, через QPropertyAnimation, переопределять move, resize. Последнее отпадает, так как методы невиртуальные.

Можно конечно как-то сделать через таймеры, но хотелось бы не одноразовое решение. Вывод - для общего решения придется писать свой лейаут, который будет менять значения нужных полей через QPropertyAnimation.
Записан
Kolobok
Гость
« Ответ #5 : Декабрь 19, 2009, 14:22 »

Проще написать отдельный класс, который берет данные из лейоута и управляет анимацией.
Кроме того, самописные лейоуты нельзя использовать в дизайнере. Я, во всяком случае, не нашел как.
Записан
SpiritFire
Гость
« Ответ #6 : Декабрь 20, 2009, 00:10 »

В общем, разобрася. Когда лэйаут пересчитывает геометрию всех входящих в него итемов, он, что логично, выполняет что-то вроде

Код:
foreach( QLayoutItem* item, items)
    item->setGeometry( newGeometry );

При этом метод QLayoutItem::setGeometry(...) виртуальный. Сюда и надо копать. Оказывается, при добавлении виджета (пока анимировал только размеры виджетов, не дочерних лейаутов, хоть это не принципиально) создается его класс-потомок QWidgetItem : public QLayoutItem... Или новоиспеченный AnimatedWidgetItem : public QWidgetItem. Вот и вся хитрость.

Стандартный ВиджетИтем изменяет геометрию через вызов QWidget::setGeometry.
Новый обработчик изменяет геометрию в соответствии с моими религиозными убеждениями, которые я подробно изложил в своей реализации AnimatedWidgetItem::setGeometry =) А там все просто: позаимствовал часть кода из стандартного обработчика, но геометрию меняю через QPropertyAnimation. Все...

Что имеем: пользоваться дизайнером можно, лейауты стандартные, виджеты тоже абсолютно стандартные.... Единственное но: будут анимированы только виджеты, добавленные динамически через layut->addItem( new AnimatedWidgetItem(widget, peremeters) );

Если нужно, могу поделиться сорцами, это не военная тайна )

« Последнее редактирование: Декабрь 20, 2009, 00:53 от Dendy » Записан
Dendy
Гость
« Ответ #7 : Декабрь 20, 2009, 00:53 »

Делись, очень интересно посмотреть (-;
Записан
Gorthauer
Гость
« Ответ #8 : Декабрь 20, 2009, 12:11 »

Ну у меня была нужда сделать анимацию лишь при появлении виджета, поэтому я на время анимации просто отключил лэйаут
Записан
NicK
Гость
« Ответ #9 : Декабрь 23, 2009, 09:50 »

В общем, разобрася. Когда лэйаут пересчитывает геометрию всех входящих в него итемов, он, что логично, выполняет что-то вроде

Код:
foreach( QLayoutItem* item, items)
    item->setGeometry( newGeometry );

При этом метод QLayoutItem::setGeometry(...) виртуальный. Сюда и надо копать. Оказывается, при добавлении виджета (пока анимировал только размеры виджетов, не дочерних лейаутов, хоть это не принципиально) создается его класс-потомок QWidgetItem : public QLayoutItem... Или новоиспеченный AnimatedWidgetItem : public QWidgetItem. Вот и вся хитрость.

Стандартный ВиджетИтем изменяет геометрию через вызов QWidget::setGeometry.
Новый обработчик изменяет геометрию в соответствии с моими религиозными убеждениями, которые я подробно изложил в своей реализации AnimatedWidgetItem::setGeometry =) А там все просто: позаимствовал часть кода из стандартного обработчика, но геометрию меняю через QPropertyAnimation. Все...

Что имеем: пользоваться дизайнером можно, лейауты стандартные, виджеты тоже абсолютно стандартные.... Единственное но: будут анимированы только виджеты, добавленные динамически через layut->addItem( new AnimatedWidgetItem(widget, peremeters) );

Если нужно, могу поделиться сорцами, это не военная тайна )



Очень нужно. поделитесь, пожалуйста, исходниками.
Записан
SpiritFire
Гость
« Ответ #10 : Декабрь 28, 2009, 03:49 »

Извините, что так длго не отвечал - не было времени.

Вот, что обещал, правда в реальном проекте получаю интересный глюк: если степерь вложенности анимированных виджетов большая, то по непонятной причине парент устанавливается неправильно.

помогает следующий хак:

Код:
layout->addWidget( widget );   // добавление
layout->itemAt( layout->count-1 ); // извлечение его же
layout->addItem( new AnimatedWidgetItem(widget, peremeters) );  // снова добавление

Если кто найдет точно из-за чего так происходит - буду премного благодарен Улыбающийся Ну а так юзайте на здоровье)

Во вложении простейший проект для VS2008, на работе подобное легко собирал на Креаторе+МинГВ.
Записан
SABROG
Гость
« Ответ #11 : Январь 05, 2010, 18:09 »

Ниче так

Записан
BlackTass
Гость
« Ответ #12 : Январь 06, 2010, 14:59 »

Ниче так

Вот только при уменьшении надо что-то другое явно делать. Возможно сразу выставлять правильный размер, а потом делать баунс для красоты.
Записан
SABROG
Гость
« Ответ #13 : Январь 06, 2010, 15:15 »

Хотелось бы посмотреть как это всё будет работать на перегруженном контролами интерфейсе Улыбающийся

У меня в фирме с некоторого времени все сотрудники были переведены на работу через удаленный рабочий стол (remote desktop), т.к. сервак находится в дата центре весь траффик идет через интернет. И я с некоторым разочарованием смотрю на тормоза моих программ, где применялась анимация, спец эффекты и тому подобное. Так что тут либо шашечки, либо ехать. Полагаю разработчики должны вводить какие либо настройки отключающие специальные эффекты.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Январь 06, 2010, 16:26 »

По-моему это хороший feature request для Qt
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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