Russian Qt Forum

Qt => Мультимедиа => Тема начата: darkmacho от Декабрь 04, 2008, 14:43



Название: gif без проблем
Отправлено: darkmacho от Декабрь 04, 2008, 14:43
Можно сделать так что бы   QPixmap формат так же выводил gif формат а то с qmovie что то не получается.Для этого нужны плагины? при сборке включил gif


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 05, 2008, 07:03
Что никто не знает?


Название: Re: gif без проблем
Отправлено: spirit от Декабрь 05, 2008, 09:39
а что с QMovie не так?


Название: Re: gif без проблем
Отправлено: ритт от Декабрь 05, 2008, 11:39
Что никто не знает?
мля, ты ещё удивляешься? задавай вопрос так, чтобы он был понятен другим...
* формата QPixmap не существует!
* как формат может выводить формат?
* QMovie отрисовывает гиф с анимацией (покадрово), QPixmap же может содержать только один кадр.

а теперь перефразируй - что именно тебе требуется?


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 05, 2008, 17:49
Где то я тут видел что можно воспользоваться плагином gif и выводить анимацию с помощью QPixmap.Как это сделать?


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 05, 2008, 20:36
У меня есть  нестандартное окно (т.е. картинка) Туда я вывожу png картинки и иногда нужно вместо них проиграть gif картинки как это можно организовать?


Название: Re: gif без проблем
Отправлено: spirit от Декабрь 05, 2008, 20:39
Код
C++ (Qt)
QLabel::setMovie
QLabel::setPixmap
 


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 05, 2008, 20:54
а что ето?

Там же нужно создавать QLabel объекты да? В книге то там главное окно это сам виджет а как здесь быть?


Название: Re: gif без проблем
Отправлено: spirit от Декабрь 05, 2008, 20:56
Цитировать
The QLabel widget provides a text or image display.

QLabel
 (http://doc.trolltech.com/4.4/qlabel.html#details)


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 05, 2008, 20:59
у меня там штук 30 картинок я там что щас для каждого эти объекты создать должен?


Название: Re: gif без проблем
Отправлено: spirit от Декабрь 05, 2008, 21:16
зачем? лэйбл один, а картинки естественно надо подружать либо через QMovie или QPixmap. в чем собственно проблема?
Код
C++ (Qt)
...
QPixmap img("path/to/my/image/img.png");
m_label->setPixmap(img);
...
 
m_label -- член гуевого класса.


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 05, 2008, 21:33
я все же не понял QPainter  для этого подойдет?
там нет метода setPixmap.А если создать QLabel lbl;
там для каждой картинки нужно выполнять lbl.setPixmap(img) выводить все это и каждый раз менять координаты lbl???


Название: Re: gif без проблем
Отправлено: spirit от Декабрь 05, 2008, 21:35
блин, что сделать надо-то? нормально вопрос сформировать можно?


Название: Re: gif без проблем
Отправлено: pastor от Декабрь 05, 2008, 21:37
Немного вмешаюсь.. Открываем ассистант, смотрим описание QMovie, и видим пример:

Код
C++ (Qt)
QLabel label;
QMovie *movie = new QMovie("animations/fire.gif");
 
label.setMovie(movie);
movie->start();

Если не получится, выкладывай код


Название: Re: gif без проблем
Отправлено: pastor от Декабрь 05, 2008, 21:42
А также загляни в QTDIR/examples/widgets/movie/ посмотри\изуче этот пример


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 05, 2008, 21:44
у меня есть :
QPixmap *p[15];
QMovie *pp[15];
В  *p -png формат, в *pp - gif формат
В начале  выводиться весь массив *p как таблица .
При нажатии какой-нибудь клавиши мне нужно что бы вместо них появились элементы *pp т.е. проигрывались gif файлы .Вот и все!


Название: Re: gif без проблем
Отправлено: spirit от Декабрь 05, 2008, 21:46
ну вот размести необходимое кол-во QLabel и сетай в цикле пиксмапы, а потом по нужному событию сетай в этиже QLabel свои QMovie.


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 05, 2008, 21:50
понял все а как изменить координаты лейбла знаю что есть lbl.x и lbl.y  как их изменить


Название: Re: gif без проблем
Отправлено: pastor от Декабрь 05, 2008, 21:54
Я чего-то непойму. Зачем менять координаты?

1) Размести на виджете 15 QLabel
2) Установи png картинки для них из массива p
3) По нашатию какой либо кнопки, установи gif картинки из массива pp

В чем сложность?


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 05, 2008, 21:56
ну вот эти 15 QLabel нужно для каждой свои координаты как их задавать
для QPixmapa же drawPixmap(x,y,img); x,y- координаты.как с лейблом быть то?


Название: Re: gif без проблем
Отправлено: spirit от Декабрь 05, 2008, 21:59
юзай QGridLayout (http://doc.trolltech.com/4.4/qgridlayout.html)


Название: Re: gif без проблем
Отправлено: pastor от Декабрь 05, 2008, 22:00
ну вот эти 15 QLabel нужно для каждой свои координаты как их задавать

Для этого нужн открыть книгу (или ассистант) по Qt и почитать про QLayout, QGridLayout, QHBoxLayout, QVBoxLayout etc


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 06, 2008, 12:06
А по проще нельзя а то там щас все менять надо


Название: Re: gif без проблем
Отправлено: lit-uriy от Декабрь 06, 2008, 12:55
А по проще нельзя а то там щас все менять надо
например как?


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 07, 2008, 23:03
Это же для того что бы когда окно можно было расширать все было на местах, а у меня окно у которого нельзя изменять размеры.И мне не понятно как создавать лейблы без рамки, а то рядом с главным окном появляетя и это лейбл


Название: Re: gif без проблем
Отправлено: ритт от Декабрь 08, 2008, 09:36
опять чушь какая-то. давай код...


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 08, 2008, 12:01
Вот :
Код:
#include <qapplication.h>
#include<qpixmap.h>
#include <qlabel.h>
#include<qmovie.h>
#include <QMouseEvent>
#include<qbitmap>
#include <qpainter.h>
#include<qtime>
#include<vector>
#include<list>
#include<qlist>
bool yes=false;


class Window : public QLabel {

private:
    QPoint  m_ptPosition;

protected:
  /*  virtual void Window::mousePressEvent(QMouseEvent* pe)
    {
        m_ptPosition = pe->pos();
   }
*/
/*
    virtual void Window::mouseMoveEvent(QMouseEvent* pe)
    {
        move(pe->globalPos() - m_ptPosition);
    }
*/
virtual  void Window::mousePressEvent(QMouseEvent* pe);
   

    virtual void  keyPressEvent(QKeyEvent* e);

public:
    Window(QWidget* pwgt = 0)
: QLabel(pwgt,Qt::FramelessWindowHint | Qt::Window)
    {
    }



void paintEvent( QPaintEvent * );
void NewPix();
int who_is,who_isx,who_isy;
QPixmap *p[20];
QMovie *pp[20];
QPixmap *ball;
QPoint m[6][5];
int who[6][5];
int sost[6][5];
QList <int> kept;
QList <int>:: iterator er;
QLabel lbl;
int schet;
};

void Window::NewPix()
{
int temp;
schet=0;
qint32 tx=80,ty=100;

for(qint32 y=0;y<5;y++)
{
for(qint32 x=0;x<6;x++)
{m[x][y].setX(tx);
m[x][y].setY(ty);
tx+=100;
}
tx=80;
ty+=110;
}
QTime time;
srand(time.second());

for(int i=0;i<15;i++)
{temp=rand()%15;
kept.append(temp);
kept.append(temp);
}

for(int y=0;y<5;y++)
{
for(int x=0;x<6;x++)
{ temp=rand()%kept.count();
who[x][y]=kept.at(temp);
kept.removeAt(temp);
//kept.remove(temp);
//schet++;
}
}

//if(kept.count==0) exit(0);

p[0]= new QPixmap(  "img/1.png");   
p[1]= new QPixmap(  "img/2.png"); 
p[2]= new QPixmap(  "img/3.png"); 
p[3]= new QPixmap(  "img/4.png"); 
p[4]= new QPixmap(  "img/5.png"); 
p[5]= new QPixmap(  "img/6.png"); 
p[6]= new QPixmap(  "img/7.png"); 
p[7]= new QPixmap(  "img/8.png");   
p[8]= new QPixmap(  "img/9.png"); 
p[9]= new QPixmap(  "img/10.png"); 
p[10]= new QPixmap(  "img/11.png"); 
p[11]= new QPixmap(  "img/12.png"); 
p[12]= new QPixmap(  "img/13.png"); 
p[13]= new QPixmap(  "img/14.png"); 
p[14]= new QPixmap(  "img/15.png"); 

ball=new QPixmap(  "img/16.png"); 

pp[0]= new QMovie(  "img/1.gif");   
pp[1]= new QMovie(  "img/2.gif"); 
pp[2]= new QMovie(  "img/3.gif"); 
pp[3]= new QMovie(  "img/4.gif"); 
pp[4]= new QMovie(  "img/5.gif"); 
pp[5]= new QMovie(  "img/6.gif"); 
pp[6]= new QMovie(  "img/7.gif"); 
pp[7]= new QMovie(  "img/8.gif");   
pp[8]= new QMovie(  "img/9.gif"); 
pp[9]= new QMovie(  "img/10.gif"); 
pp[10]= new QMovie(  "img/11.gif"); 
pp[11]= new QMovie(  "img/12.gif"); 
pp[12]= new QMovie(  "img/13.gif"); 
pp[13]= new QMovie(  "img/14.gif"); 
pp[14]= new QMovie(  "img/15.gif"); 


for(int y=0;y<5;y++)
for(int x=0;x<6;x++)
              sost[x][y]=0;

who_is=-1;
who_isx=-1;
who_isy=-1;
}


 void Window::mousePressEvent(QMouseEvent* pe)
    {//exit(0);
int h=pe->x(),t=pe->y();       
for(qint32 y=0;y<5;y++)
for(qint32 x=0;x<6;x++)
{

if(m[x][y].x()<h && m[x][y].x()+75>h && m[x][y].y()<t && m[x][y].y()+100>t)
if(sost[x][y]!=2)
{
if (who_is==who[x][y]){schet+=5;sost[x][y]=2; sost[who_isx][who_isy]=2;sost[x][y]==2; who_is=-1; update();}
else
if(who_is==-1) {who_is=who[x][y];who_isx=x;who_isy=y;sost[x][y]=1; update();}
else
if(who_is!=-1 && who_is!=who[x][y])
{who_is=-1;sost[who_isx][who_isy]=0;update(); }
}
}

    }


void Window::paintEvent( QPaintEvent * )
{ QPainter pip;

QString st=QString::number(schet);

    pip.begin(this);
pip.setFont(QFont("Times",25,QFont::Normal));
pip.drawPixmap(0,0,QPixmap("img/screen6.png"));
pip.drawText(800,100,st);

if(yes)
{for(qint32 y=0;y<5;y++)
for(qint32 x=0;x<6;x++)

if(sost[x][y]==0) pip.drawPixmap(m[x][y],*ball);
else
if(sost[x][y]==1)
pip.drawPixmap(m[x][y],*p[who[x][y]]);

}
pip.end();
}

void Window::keyPressEvent(QKeyEvent* e)
{ if(e->key()==Qt::Key_Return) exit(0);

    if(e->key()==Qt::Key_Space)
{yes=true;
update();
}
}



// ----------------------------------------------------------------------
int main(int argc, char** argv)
{ QApplication app(argc, argv);   
Window win;
QPixmap pix("img/screen6.png");

win.NewPix();
win.setWindowTitle("My games");
win.move(30,30);
win.setPixmap(pix);
win.setMask(pix.mask());
//win.setBaseSize(1500,1500);
win.setFixedHeight(800);
win.setFixedWidth(1000);
win.show();



    return app.exec();
}


Название: Re: gif без проблем
Отправлено: spirit от Декабрь 08, 2008, 12:10
может лучше заюзать QGraphicsView (http://doc.trolltech.com/4.4/qgraphicsview.html) исходя из того, что это попытка создания игры.  ;)


Название: Re: gif без проблем
Отправлено: ритт от Декабрь 08, 2008, 12:36
ага, ну, понятино чего ты хочешь добиться...
а в чём тогда проблема? рисуй мувик покадрово (так же, как пиксмап, но с постоянным сдвигом на фрэйм) - все необходимые методы QMovie предоставляет. если сам пока не придумал как это будет, советую подсмотреть как реализовано в QLabel.
в реализации как у тебя Q*Layout действительно не нужен...


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 08, 2008, 12:46
 ??? извините я не понял.Т.е. нужно как-то менять кадр в каждой кратинке что ли и потом показывать там же таймер нужен будет так?


Название: Re: gif без проблем
Отправлено: ритт от Декабрь 08, 2008, 13:18
я код QLabel'а пока что поленился ковырять, но предполагаю, что там стартуется таймлайн и на срабатывание инкрементится текущий фрэйм мувика, после чего зовётся апдейт(), а в пэинтИвенте пиксмап текущего фрэйма рисуется на пэинтере с размерами родителя...наверное, примерно так...
в твоём же случае основным отличием будет то, что вместо перехода на следующий фрэйм одного мувика, тебе нужно будет пройтись по массиву и инкрементнуть текущий фрэйм у каждого мувика из массива.
ещё раз советую проглядеть код кулабела.


Название: Re: gif без проблем
Отправлено: darkmacho от Декабрь 08, 2008, 15:48
наверно для такой маленькой игрушки и простые картинки пойдут а то щас нужно с таймером работать и т.д.


Название: Re: gif без проблем
Отправлено: ритт от Декабрь 08, 2008, 18:08
с таймлайном - это значительно проще.