Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: n4ela от Июнь 19, 2010, 19:37



Название: QMovie как крутить gif?
Отправлено: n4ela от Июнь 19, 2010, 19:37
Gif вывожу так:
Код
C++ (Qt)
   label2 = new QLabel(this);
   QMovie *movie = new QMovie(":/img/test.gif");
   label2->setMovie(movie);
   movie->start();
 
И при срабатывание определенного слота мне надо еще ее и крутить по часовой стрелки. Я так посмотрел справку метод setMovie есть только у QLabel, gif - выводить можно только через QMovie, QLabel сам по себе крутить нельзя, крутить может только QPainter, но он не может через себя отрисовать анимацию. Даже не знаю как быть.
Каждый кадр gif'a у меня есть отдельно, но не уверен что это как то поможет.


Название: Re: QMovie как крутить gif?
Отправлено: kibsoft от Июнь 19, 2010, 20:21
Точно не знаю, но скорее всего можно наследовать QLabel и переопределить paintEvent(), который и будет рисовать виджет(как он крутится).


Название: Re: QMovie как крутить gif?
Отправлено: lit-uriy от Июнь 19, 2010, 21:15
дак может сделать gif-ку которая крутится?


Название: Re: QMovie как крутить gif?
Отправлено: n4ela от Июнь 19, 2010, 21:24
Точно не знаю, но скорее всего можно наследовать QLabel и переопределить paintEvent(), который и будет рисовать виджет(как он крутится).
Не совсем понял, вот унаследую я свой класс от QLabel, переопределю paintEvent, и что в нем писать? Кого крутить? Ведь я не могу крутить сам QLabel(метода rotate или setTransform у него нету). Через QPainter я могу выводить только только статическую картинку через drawPixmap.

дак может сделать gif-ку которая крутится?
Так и буду делать если не чего лучше не придумаю. Точнее создам еще 3и gif'ки которые будут смотреть в разные стороны.
А вообще суть такова вот он ходит по карте (http://s06.radikal.ru/i179/1006/26/5fcb20761162.gif)  и когда встречает препятствие должен будет обходить его, т.е. поворачивать влево/вправо


Название: Re: QMovie как крутить gif?
Отправлено: Kolobok от Июнь 19, 2010, 22:25
А чем QGraphicsView не подходит.


Название: Re: QMovie как крутить gif?
Отправлено: zenden от Июнь 19, 2010, 22:56
ну и дела... игры с помощью QLabel делают  ;D ;D


Название: Re: QMovie как крутить gif?
Отправлено: n4ela от Июнь 19, 2010, 23:43
А чем QGraphicsView не подходит.
Не знал, еще оказывается у QMovie есть сигнал frameChanged(int) и метод currentPixmap();
Нашел в этой теме может кому пригодится http://www.prog.org.ru/index.php?topic=12520.msg79577

ну и дела... игры с помощью QLabel делают  ;D ;D
Пока что делаю наглядную реализацию А* алгоритма. Но в будущем хочу попробовать на основе этого алгоритма написать игру tower defence, так что буду рад если что нибудь посоветуете на эту тему, скажем может тут qt будет вообще не к месту, а лучше брать какой нибудь готовый 2д движок, если так то хотелось бы услышать название. Пока решал свою проблему наткнулся такую интересную вещь как QGLWidget пока что сижу читаю про нее, но вроде с QGraphicsView полегче работать.


Название: Re: QMovie как крутить gif?
Отправлено: DarkKnight от Январь 17, 2012, 14:49
Может кому-нибудь пригодится....код анимации лучше вставить в таймер. Просто я Qt только начал изучать.до таймеров дело не дошло еще.
Код
C++ (Qt)
///////////////////////////////////////////////////////
// DQActor.h
// Class for animated image
// (c) DarKnight aka Sergey Aksenov (2012, Russia)
// darkknight_05@mail.ru
////////////////////////////////////////////////////////
 
#ifndef DQACTOR_H
#define DQACTOR_H
 
#include "pacman_le.h"
 
// DQActor
class DQActor
{
public:
QMovie *movie;
QVector2D pos;
std::vector<QGraphicsPixmapItem*> piVec;
float rot, width, height;
UINT32 currFrame, frameCount, nextFrameDelay, lastTime;
 
// DQActor
DQActor::DQActor()
{
_initVars();
}
 
DQActor::DQActor(PacMan *widget, char* imgPath)
{
_initVars();
build(widget, imgPath);
}
 
void DQActor::_initVars()
{
movie = NULL;
pos.setX(0.0f);pos.setY(0.0f);
rot = width = height = NULL;
currFrame = frameCount = nextFrameDelay = lastTime = NULL;
}
 
bool DQActor::build(PacMan *widget, char* imgPath)
{
bool loadOk = true;
 
movie = new QMovie(imgPath);
loadOk = movie->isValid();
 
int ind=0;
frameCount = movie->frameCount();
nextFrameDelay = movie->nextFrameDelay();
 
movie->start();
do
{
ind = movie->currentFrameNumber();
 
QPixmap pix = movie->currentPixmap();
width = pix.width();
height = pix.height();
 
QGraphicsPixmapItem *pit = widget->scene->addPixmap(pix);
pit->setTransformOriginPoint(width*0.5f,height*0.5f); // centered
pit->setZValue(1.0f); // bring to front
piVec.push_back(pit);
 
if(ind>0) pit->hide(); // пря4ем остальные фреймы
 
movie->jumpToNextFrame(); // go to next frame
}while( ind < (frameCount-1) );
 
movie->stop();
 
return loadOk;
}
 
void DQActor::move(float x, float y)
{
pos.setX(pos.x()+x); pos.setY(pos.y()+y);
piVec[currFrame]->setPos(pos.x(),pos.y());
}
 
void DQActor::setPos(float x, float y)
{
pos.setX(x); pos.setY(y);
piVec[currFrame]->setPos(x,y);
}
 
void DQActor::setRot(float angle)
{
rot = angle;
piVec[currFrame]->setRotation(angle);
}
 
void DQActor::update()
{
// animate
// for better put it in timer
UINT32 go = lastTime + nextFrameDelay;
if(go <= timeGetTime())
{
lastTime = timeGetTime();
piVec[currFrame]->hide();
if(currFrame < (frameCount-1)) currFrame++; else currFrame=NULL;
piVec[currFrame]->show();
piVec[currFrame]->setPos(pos.x(),pos.y());
piVec[currFrame]->setRotation(rot);
}
 
// update trasformation
piVec[currFrame]->update(pos.x(),pos.y(),width,height);
}
 
 
DQActor::~DQActor()
{
SAFE_DELETE_VEC(piVec);
SAFE_DELETE(movie);
}
 
};
 
#endif
 


Название: Re: QMovie как крутить gif?
Отправлено: antoshib от Ноябрь 07, 2013, 13:23
Использовал тоже такое, но почему-то на чистой машине в собранном приложении gif-а вообще не видно..? может библиотеку надо какую-то еще, кроме основных?
ps..: пардон, не нашел сразу http://www.prog.org.ru/topic_23832_0.html (http://www.prog.org.ru/topic_23832_0.html)