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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QMovie как крутить gif?  (Прочитано 7345 раз)
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 у меня есть отдельно, но не уверен что это как то поможет.
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Июнь 19, 2010, 20:21 »

Точно не знаю, но скорее всего можно наследовать QLabel и переопределить paintEvent(), который и будет рисовать виджет(как он крутится).
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Июнь 19, 2010, 21:15 »

дак может сделать gif-ку которая крутится?
Записан

Юра.
n4ela
Гость
« Ответ #3 : Июнь 19, 2010, 21:24 »

Точно не знаю, но скорее всего можно наследовать QLabel и переопределить paintEvent(), который и будет рисовать виджет(как он крутится).
Не совсем понял, вот унаследую я свой класс от QLabel, переопределю paintEvent, и что в нем писать? Кого крутить? Ведь я не могу крутить сам QLabel(метода rotate или setTransform у него нету). Через QPainter я могу выводить только только статическую картинку через drawPixmap.

дак может сделать gif-ку которая крутится?
Так и буду делать если не чего лучше не придумаю. Точнее создам еще 3и gif'ки которые будут смотреть в разные стороны.
А вообще суть такова вот он ходит по карте   и когда встречает препятствие должен будет обходить его, т.е. поворачивать влево/вправо
Записан
Kolobok
Гость
« Ответ #4 : Июнь 19, 2010, 22:25 »

А чем QGraphicsView не подходит.
Записан
zenden
Гость
« Ответ #5 : Июнь 19, 2010, 22:56 »

ну и дела... игры с помощью QLabel делают  Смеющийся Смеющийся
Записан
n4ela
Гость
« Ответ #6 : Июнь 19, 2010, 23:43 »

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

ну и дела... игры с помощью QLabel делают  Смеющийся Смеющийся
Пока что делаю наглядную реализацию А* алгоритма. Но в будущем хочу попробовать на основе этого алгоритма написать игру tower defence, так что буду рад если что нибудь посоветуете на эту тему, скажем может тут qt будет вообще не к месту, а лучше брать какой нибудь готовый 2д движок, если так то хотелось бы услышать название. Пока решал свою проблему наткнулся такую интересную вещь как QGLWidget пока что сижу читаю про нее, но вроде с QGraphicsView полегче работать.
« Последнее редактирование: Июнь 20, 2010, 00:01 от n4ela » Записан
DarkKnight
Гость
« Ответ #7 : Январь 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
 
« Последнее редактирование: Январь 17, 2012, 15:00 от DarkKnight » Записан
antoshib
Гость
« Ответ #8 : Ноябрь 07, 2013, 13:23 »

Использовал тоже такое, но почему-то на чистой машине в собранном приложении gif-а вообще не видно..? может библиотеку надо какую-то еще, кроме основных?
ps..: пардон, не нашел сразу http://www.prog.org.ru/topic_23832_0.html
« Последнее редактирование: Ноябрь 07, 2013, 13:27 от antoshib » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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