Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Natalie от Июль 23, 2008, 14:52



Название: управление анимацией в SVG
Отправлено: Natalie от Июль 23, 2008, 14:52
Всем здрасти :)

искала такой вопрос в существующих темах, но не нашла.

вопрос такой:
имеется SVG файл с анимацией. Возможно как-нибудь этой анимацией управлять? приостанавливать ее, возобновлять...
может это можно сделать через QTimeLine? но честно говоря, не понимаю как.

если кто-то такое делал, объясните пожалуйта :)


Название: Re: управление анимацией в SVG
Отправлено: pastor от Июль 23, 2008, 15:50
Посотрите класс QMovie.


Название: Re: управление анимацией в SVG
Отправлено: Natalie от Июль 23, 2008, 16:22
у меня как-то не получалось проигрывать SVG файлы через класс QMovie.
Насколько я понимаю, для проигрывания SVG файлов Qt предоставляет классы QSvgRenderer, QSvgWidget и QGraphicsSvgItem. Но в них ничего об приостановки анимации не сказано.


Название: Re: управление анимацией в SVG
Отправлено: lit-uriy от Июль 23, 2008, 17:30
Есть такой пример: painting/svgviewer (файл: painting/svgviewer/svgview.cpp )

и еще вот такой сигнал:
void QSvgRenderer::repaintNeeded ()   [signal]
This signal is emitted whenever the rendering of the document needs to be updated, usually for the purposes of animation.


Название: Re: управление анимацией в SVG
Отправлено: Natalie от Июль 23, 2008, 17:50
я смотрела этот пример, но там идет лишь load и затем просто проигрывается то, что записано в XML-е. Остановить присутствующую анимацию не удается.

Если же не подсоединять сигнал repaintNeeded() , то есть не писать так:
connect(doc, SIGNAL(repaintNeeded()), this, SLOT(update()));
то при изнении размеров окна, либо при сворачивании/разворацивании все равно происходит перерисовка и анимация проявляется (в случае с примером painting/svgviewer шарики покадрово появляются снизу сцены)

Также я попробовала использовать функцию QSvgRenderer::setFramesPerSecond(int num). В документации сказано:
The number of frames per second is 0 if the current document is not animated.
Я выставила значение 0, но это ни на что не повлияло :( Автоматом стоит 30 кадров в секунду. И даже если выставлять в два-три раза больше кадров в секунду, анимация при этом не ускоряется. Так что я как-то не поняла на что влияет эта функция...


Название: Re: управление анимацией в SVG
Отправлено: lit-uriy от Июль 23, 2008, 18:10
а немогли по случайности перепутать класс, ведь там их 3 штуки? уж управление скоростью должно работать.
(сам сейчас проверить немогу)


Название: Re: управление анимацией в SVG
Отправлено: Natalie от Июль 23, 2008, 18:30
я попыталась модифицировать пример painting/svgviewer
в конструкторе дописала:

doc = new QSvgRenderer(file, this);
doc->setFramesPerSecond(0); // <- добавила вот эту строчку
connect(doc, SIGNAL(repaintNeeded()), this, SLOT(update()));

проверила, что он выставляет 0 фреймов в секунду. Но никаких изменений.

и ни в одном из этих трех классов не нашла никакой другой функции, которая могла бы как-то остановить анимацию.

в SVG файле для каждого элемента анимация выставлена таким образом:
<animateTransform attributeName="transform" type="translate"
        values="0,0; 0,-800" begin="1s" dur="9s" fill="freeze" repeatCount="indefinite" />
может можно как-то достучаться до времени и остановить его. Или может можно изменить этот таг так, чтобы остановить анимацию, а затем ее возобновить по какому-то событию. Хотя из предоставляемых классов, насколько я поняла, доступен лишь id элементов из SVG.


Название: Re: управление анимацией в SVG
Отправлено: lit-uriy от Июль 23, 2008, 18:46
конструкторе какого класса?
---
Собственно сразу забыл спросить: Какая версия Qt и какая ОСь?


Название: Re: управление анимацией в SVG
Отправлено: Natalie от Июль 23, 2008, 20:07
в конструкторе класса SvgNativeView в примере painting/svgviewer

версия Qt у меня 4.4.0. Windows XP