Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: muaddib1981@mail.ru от Ноябрь 06, 2009, 11:43



Название: как сделать анимацию
Отправлено: muaddib1981@mail.ru от Ноябрь 06, 2009, 11:43
как сделать отображение перемещения объекта

Код не дает желаемого результата
Код:
QMainWindow *wnd1;
QMainWindow *wnd2;

for (i=0;i<100;i++)
{
  wnd1->wnd2->setPos(x+i,y+j); //Изменение параметров прорисовываемого объекта
  Sleep(100);
  wnd2->update();
};
Похоже потому, что update не выполняется сразу, а накапливается в очереди событий.
И вся очередь событий выполняется при выходе из функции, но как же тогда быть?


Название: Re: как сделать анимацию
Отправлено: Igors от Ноябрь 06, 2009, 11:49
Заменить update на repaint


Название: Re: как сделать анимацию
Отправлено: muaddib1981@mail.ru от Ноябрь 06, 2009, 11:58
Большое спасибо, сам бы мог догадаться!  :D


Название: Re: как сделать анимацию
Отправлено: jasf от Ноябрь 09, 2009, 21:41
что ж Вы в прошлом веке то сидите, когда есть такой замечательный фреймворк, как QStateMachine? :)


Название: Re: как сделать анимацию
Отправлено: muaddib1981@mail.ru от Ноябрь 10, 2009, 11:22
а что это?


Название: Re: как сделать анимацию
Отправлено: jasf от Ноябрь 10, 2009, 11:27
http://www.youtube.com/results?search_query=QStateMachine&search_type=&aq=f например :)
но выгуглить можно ещё кучу всего. При этом программируется очень легко (настройкой свойств) в несколько строк кода. Примеров в SDK так же хватает (qt\examples\animation; qt\examples\statemachine);

P.S. QStateMachine введена в Qt 4.6.


Название: Re: как сделать анимацию
Отправлено: muaddib1981@mail.ru от Ноябрь 10, 2009, 11:36
да крутая штучка, только вот qt 4.6 не вышел еще


Название: Re: как сделать анимацию
Отправлено: jasf от Ноябрь 10, 2009, 11:39
как это не вышел? ещё в марте можно было скачать образ Qt с QStateMachine. А бетки и technical preview ещё летом повыходили.


Название: Re: как сделать анимацию
Отправлено: muaddib1981@mail.ru от Ноябрь 10, 2009, 11:48
на сайте qt.nokia.com, официально выложен только 4.5, 4.6 видимо еще бета.


Название: Re: как сделать анимацию
Отправлено: Авварон от Ноябрь 10, 2009, 11:51
там слева внизу ссылка на бинарные сборки под все ОСи. Директ линк: http://qt.nokia.com/developer/qt-4.6-preview (http://qt.nokia.com/developer/qt-4.6-preview) Она глючная пока, но терпимо, для разработки как раз сойдет.


Название: Re: как сделать анимацию
Отправлено: jasf от Ноябрь 10, 2009, 11:53
2muaddib1981@mail.ru:
Вот неверю что при использовании Qt 4.6 SDK вы найдёте хоть одну вещь, которой нету в Qt 4.5 или которая работает хуже, чем в Qt 4.5, или такую, которая не работает так, как нужно конкретно вам, и которая работает в Qt 4.5. Имхо technical preview это как раз не unstable release, который не рекомендуется использовать, а именно недоработанная версия будущего релиза. Т.е. фактически Qt 4.6 но без некоторых фич, которые будут в Qt 4.6. Но, по всей видимости, уже того функционала, который есть на сегодняшний день, вашим требованиям более чем достаточно :)


Название: Re: как сделать анимацию
Отправлено: Авварон от Ноябрь 10, 2009, 12:00
ну у меня на маке стабильно не прорисовывает нижний скроллбар в Ассистанте во вьюхе.
И почему-то модель моя хоть убей не хочет дропать url извне (как будто text/urls или как он там зовется не назначен. Под 4.5 было ок все, под виндой 4.5 также работает)


Название: Re: как сделать анимацию
Отправлено: jasf от Ноябрь 10, 2009, 12:02
2Авварон: ну я подразумевал именно релиз под Windows. Так то я скачал бетку под Symbian - глючит по страшному :) Но по умолчанию, вследствии зомбирования мозга виндой подразумевал именно её. А там багов за первое время использования так и не обнаружил.


Название: Re: как сделать анимацию
Отправлено: Авварон от Ноябрь 10, 2009, 12:48
кстати вопрос, чтобы не создавать лишнюю. Как анимации дружат с лайаутами? То есть если я хочу плавно переместить виджеты и по другому - как мне это сделать?


Название: Re: как сделать анимацию
Отправлено: jasf от Ноябрь 10, 2009, 14:31
2Авварон: Отвечу так: можно (скачай Qt 4.6 и посмотри animation example).
и немного доп. инфы:
QState изменяют Q_PROPERTY а не конкретно QLayout или QWidget. Я создал собственный QAnimRectangle : public QObject, задефайнил там Q_PROPERTY (геометрию, полупрозрачность, там различная трансформация), ну и подключил обьект к QState. При каждом изменении вызывается сигнал QState::polished. Подключил к этому сигналу слот QWidget::update, и получил полностью свой класс (квадратик) с различной анимацией. Мегаудобно. В QLayout имеются:

    Q_PROPERTY(int margin READ margin WRITE setMargin)
    Q_PROPERTY(int spacing READ spacing WRITE setSpacing)
    Q_PROPERTY(SizeConstraint sizeConstraint READ sizeConstraint WRITE setSizeConstraint)

соответственно можно оперировать этими 3мя величинами. А больше ничего другого изменить и не нужно. В QWidget, кроме всего прочего, есть:


    Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry)

т.е. если ты через QState будешь изменять geometry, QWidget будет автоматически оповещать лайоут, ну и всё будет происходить как положено.

а если чего не хватает, можно дописать свои Q_PROPERTY. QState работает через мета-информацию, поэтому может работать с любым QObject и изменять практически любую величину (оперируется QVariantом)


Название: Re: как сделать анимацию
Отправлено: Авварон от Ноябрь 10, 2009, 14:37
не, я в курсе как работает анимейшн фреймворк. Просто за размеры виджета всегда отвечал лайаут, а не наоборот. Поэтому если виджет в лайауте, то смысл менять его геометрию, если лайаут ее вернет обратно? ща пример шляну который ты говоришь


Название: Re: как сделать анимацию
Отправлено: jasf от Ноябрь 10, 2009, 14:41
а. ну так в чём проблема.


    Q_PROPERTY(QSize minimumSize READ minimumSize WRITE setMinimumSize)
    Q_PROPERTY(QSize maximumSize READ maximumSize WRITE setMaximumSize)
    Q_PROPERTY(int minimumWidth READ minimumWidth WRITE setMinimumWidth STORED false DESIGNABLE false)
    Q_PROPERTY(int minimumHeight READ minimumHeight WRITE setMinimumHeight STORED false DESIGNABLE false)
    Q_PROPERTY(int maximumWidth READ maximumWidth WRITE setMaximumWidth STORED false DESIGNABLE false)
    Q_PROPERTY(int maximumHeight READ maximumHeight WRITE setMaximumHeight STORED false DESIGNABLE false)
    Q_PROPERTY(QSize sizeIncrement READ sizeIncrement WRITE setSizeIncrement)
    Q_PROPERTY(QSize baseSize READ baseSize WRITE setBaseSize)


ну или дописать property setSizeHint (ну т.е. функцию, которая будет принимать QSize и модифицировать значение, возвращаемое в sizeHint, и вызывать updateGeometry)


Название: Re: как сделать анимацию
Отправлено: manarch от Ноябрь 11, 2009, 08:57
кстати вопрос, чтобы не создавать лишнюю. Как анимации дружат с лайаутами? То есть если я хочу плавно переместить виджеты и по другому - как мне это сделать?

А что сложного то? береш пример examples\layouts\flowlayout и в функции doLayout (при расчете позиции каждого элемента) в случае если этот элемент должен изменить свое текущее положение запускаеш таймер слот которого будет перемещать этот элемент с определенной тобой скоростью от исходного положения до нужного. При этом незабудь в этой функции запомнить какие элемнеты в данный момент анимируются и как их обрабатывать в момент анимации, т.е считать что они не изменили свою позицию или что уже изменили. От этого будет зависеть что делать с другими элементами положение которых зависти текущего анимированного элемента. Если еще проще то это значит у тебя они будут анимироваться по одному или всей кучей.
Соответственно в слоте таймера ты задаеш тракторию перемещения элементов.


Название: Re: как сделать анимацию
Отправлено: manarch от Ноябрь 11, 2009, 12:47
Авварон Вот кстати между делом подредактировал пример чтобы была анимация перемещения. Можеш посмотреть и как примерно это работает.