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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Анимированная подсветка объекта на QGraphicsScene в Qt4.  (Прочитано 6796 раз)
Crazy Sage
Гость
« : Сентябрь 02, 2014, 16:09 »

Добрый день. Возник тут вопрос.
Есть qgraphicsscene, на ней некоторое количество объектов (круги, линии, квадраты), которым надо при выборе сделать подсветку бегущим черно-белым пунктиром, типа рамки выбора в фотошопе. Посоветуйте, как это проще всего сделать? Пока приходит в голову только при выборе объекта запускать в нём таймер, и по этому таймеру рисовать более широкой кистью подложку, вначале сплошную, потом пунктирную, меняя при этом цвета подложки и пунктира, но это всё-таки даст просто мигание, да и в оптимальности метода сомневаюсь.
Может есть какие-то более адекватные способы реализовать подобную штуку?
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Сентябрь 03, 2014, 08:39 »

У QPen есть свойство dashOffset, меняя его ты получишь смещение штрихов. Для анимации сделай у объекта рамки численное свойство смещение штриха и анимируй его с помощью QPropertyAnimation.
Записан

Гугль в помощь
Bepec
Гость
« Ответ #2 : Сентябрь 03, 2014, 09:28 »

Да зачем QPropertyAnimation? Хватит простого таймера.
 Смещение штрихов лишь иллюзия. Нужно только 3 кадра для полноценной сетки -0,5; 0; 0,5; штриха. Повторяя их циклично должны получить иллюзию движущейся обводки.
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #3 : Сентябрь 03, 2014, 10:33 »

Да зачем QPropertyAnimation? Хватит простого таймера.
 Смещение штрихов лишь иллюзия. Нужно только 3 кадра для полноценной сетки -0,5; 0; 0,5; штриха. Повторяя их циклично должны получить иллюзию движущейся обводки.

Для плавной анимации таймер не годится.
Записан

Гугль в помощь
Bepec
Гость
« Ответ #4 : Сентябрь 03, 2014, 10:43 »

Хм. Это странно, ведь QPropertyAnimation
Цитировать
Behind the scenes, the animations are controlled by a global timer, which sends updates to all animations that are playing.
...

Как так не годится, если оно им управляется? Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Сентябрь 03, 2014, 11:10 »

Для анимации сделай у объекта рамки численное свойство смещение штриха и анимируй его с помощью QPropertyAnimation.
Интересно каким образом для QGraphicsItem можно задействовать QPropertyAnimation Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #6 : Сентябрь 03, 2014, 11:12 »

Кстати да, оно ж вроде не от QObject'a, не?

PS пока вижу вариант что рамкой управлять будет сцена через всё таки таймер Веселый
« Последнее редактирование: Сентябрь 03, 2014, 11:28 от Bepec » Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #7 : Сентябрь 03, 2014, 11:48 »

Для анимации сделай у объекта рамки численное свойство смещение штриха и анимируй его с помощью QPropertyAnimation.
Интересно каким образом для QGraphicsItem можно задействовать QPropertyAnimation Непонимающий

Элементарно:

Код
C++ (Qt)
class MyItem: public QObject, public QGraphicsItem
 

Или использовать QGraphicsObject.

Или использовать QVariantAnimation.

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

На мой взгляд, анимации надо делать специализированными механизмами, которые присутствуют в Qt, а не городить велосипеды.
Записан

Гугль в помощь
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Сентябрь 03, 2014, 11:52 »

На мой взгляд, анимации надо делать специализированными механизмами, которые присутствуют в Qt, а не городить велосипеды.
Присутствующие в Qt механизмы не подходят для QGraphicsItem.
То, что предлагается выше иначе как "городить велосипеды" не назовёшь Грустный
Записан

Qt 5.11/4.8.7 (X11/Win)
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #9 : Сентябрь 03, 2014, 12:00 »

На мой взгляд, анимации надо делать специализированными механизмами, которые присутствуют в Qt, а не городить велосипеды.
Присутствующие в Qt механизмы не подходят для QGraphicsItem.
То, что предлагается выше иначе как "городить велосипеды" не назовёшь Грустный

Не согласен.
Уже много лет использую анимацию для анимирования элементов сцены, всё плавно и красиво. А если надо будет Easing Curve применить, как будете на таймере это городить? Возможно в рамках задачи ТС это и не нужно, но помимо рамки с муравьями есть и другие применения. К примеру, на схеме может плавно появляться новый элемент, или его перемещение можно заанимировать и т.д.

QVariantAnimation - универсальна, её можно применять ко всему чему угодно а не только к наследнику от QObject.
Записан

Гугль в помощь
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Сентябрь 03, 2014, 12:39 »

QVariantAnimation - универсальна, её можно применять ко всему чему угодно а не только к наследнику от QObject.
Да, согласен.
Записан

Qt 5.11/4.8.7 (X11/Win)
Crazy Sage
Гость
« Ответ #11 : Сентябрь 03, 2014, 12:58 »

Спасибо за советы. Правда как оказалось я не учёл, что Qt у меня строго не старше 4.4.2, там этих классов ещё не было.
Придётся делать таймер. Хотя на будущее всё равно запомню про эти варианты.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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