Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: zoro86 от Октябрь 21, 2010, 08:54



Название: правильное чтение .gif файлов...и их обновление.
Отправлено: zoro86 от Октябрь 21, 2010, 08:54
Всем привет...

В программе использую анимированые кнопки, для этого делаю так...
Код:
                QMovie *animGif = new QMovie(QString("images/anim.gif"));                
                label->setMovie(animGif);
                animGif->start();

Все работает нормально...

Проблема в том что когда программа запущена я не могу обновить .gif файлы... при удаление пишит что они используются другой программой...
Есть ли возможность считывать файл иначе.... то есть предварительно его куда то скопировать а потом читать или как нибудь еще???


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: GreatSnake от Октябрь 21, 2010, 09:04
Загрузи файл в QBuffer и уже его скорми в

QMovie( QIODevice * device, const QByteArray & format = QByteArray(), QObject * parent = 0 )


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: zoro86 от Октябрь 21, 2010, 09:23
Так понятно... а как это реализовать....

например..
Код:
    QByteArray bytes;
    QBuffer buffer(&bytes);
    buffer.open(QIODevice::WriteOnly);

Как в буфер записать картинку?


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: merke от Октябрь 21, 2010, 09:40
Код:
     QImage image("test.gif");
      QByteArray ba;
      QBuffer buf(&ba);
      image.save(&buf, "GIF");


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: zoro86 от Октябрь 21, 2010, 09:56
Делаю так
Код:
//Добавляем в буфер
                    QByteArray ba;
                    QBuffer buffer(&ba);

                    image.save(name,"GIF");
                    QIODevice *dev1 = buffer;
                    QMovie *animGif = new QMovie(dev1);
                    btnMainPrv[i]->setMovie(animGif);
                    animGif->start();

дает ошибку modules\classes\mainwindow.cpp:3583: error: cannot convert 'QBuffer' to 'QIODevice*' in initialization
???


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: GreatSnake от Октябрь 21, 2010, 10:00
Ну дык ёлы-палы...
Зачем делаете присваивание "QIODevice *dev1 = buffer;"?
Отдавайте buffer на вход QMovie.

Хм, извиняюсь, но какой-то вы странный "самовар", коли делаете такие детские ошибки - пытаетесь получить указатель без '&'.


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: zoro86 от Октябрь 21, 2010, 10:04
пробовал говорит..

Код:
error: no matching function for call to 'QMovie::QMovie(QBuffer&)' 
..\..\Qt\2010.04\qt\include\QtGui/../../src/gui/image/qmovie.h:152: note: candidates are: QMovie::QMovie(const QMovie&)
..\..\Qt\2010.04\qt\include\QtGui/../../src/gui/image/qmovie.h:94: note: QMovie::QMovie(const QString&, const QByteArray&, QObject*)
..\..\Qt\2010.04\qt\include\QtGui/../../src/gui/image/qmovie.h:93: note: QMovie::QMovie(QIODevice*, const QByteArray&, QObject*)
..\..\Qt\2010.04\qt\include\QtGui/../../src/gui/image/qmovie.h:92: note: QMovie::QMovie(QObject*)


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: GreatSnake от Октябрь 21, 2010, 10:07
мде...

QMovie *animGif = new QMovie(&buffer);

Надо бы освоить азы сначала.


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: zoro86 от Октябрь 21, 2010, 11:24
За наставления спасибо.... :-\ буду по внимательней..

делаю так...
Код:
                QImage image;
                QString name = QString("images/anime.gif");

                    image.load(name);
                    //Добавляем в буфер
                    QBuffer buffer;
                    buffer.open(QBuffer::ReadWrite);

                    QDataStream out(&buffer);
                         out << image;

                    QMovie *animGif = new QMovie(&buffer);
                    btnMainPrv[i]->setMovie(animGif);
                    animGif->start();

и так...
Код:
                QImage image;

                QString name = QString("images/anime.gif");
             
                    image.load(name);
                    //Добавляем в буфер
                    QByteArray ba;
                    QBuffer buffer(&ba);
                    buffer.open(QBuffer::ReadWrite);
                    image.save(&buffer,"GIF");

                    QMovie *animGif = new QMovie(&buffer);
                    label->setMovie(animGif);
                    animGif->start();

Картинки нету... что делаю не так..


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: GreatSnake от Октябрь 21, 2010, 11:32
Цитировать
Картинки нету... что делаю не так..
QBuffer создали на стэке... Азы однако...


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: zoro86 от Октябрь 21, 2010, 11:46
Я только начал QBuffer юзать, так что поясните смысл для не просвященных
Цитировать
QBuffer создали на стэке... Азы однако...


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: GreatSnake от Октябрь 21, 2010, 11:50
При выходе из текущего скопа объект QBuffer будет уничтожен.
Это не Qt - это С++!


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: merke от Октябрь 21, 2010, 13:22
Т.е. русским языком: создавай буфер глобально. Получается при выходе из данноЙ функции буфер исчезает. Объяви в заголовочном файле как
Код:
QBuffer *bufer;
А в конструкторе класса уже создавай его 
Код:
bufer = new QBuffer;

А уже в своей функцие делай следую 
Код:
buffer.open(QBuffer::ReadWrite);
и так далее...


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: zoro86 от Октябрь 21, 2010, 13:58
Объявляю
Код:

        QBuffer *buffer;
как глобальные...

далее в контролере делаю ..
Код:
    buffer = new QBuffer;

Код:
                QImage image;
                QString name = QString("images/animate.gif"));
                image.load(name);

                //Добавляем в буфер
                buffer->open(QBuffer::ReadWrite);
                image.save(&buffer,"GIF");
                QMovie *animGif = new QMovie(&buffer);
                label->setMovie(animGif);
                animGif->start();

при компиляции говорит..
Код:
[color=red]
modules\classes\mainwindow.cpp:3589: error: no matching function for call to 'QImage::save(QBuffer**, const char [4])'
..\..\Qt\2010.04\qt\include/QtGui/../../src/gui/image/qimage.h:242: note: candidates are: bool QImage::save(const QString&, const char*, int) const
..\..\Qt\2010.04\qt\include/QtGui/../../src/gui/image/qimage.h:243: note: bool QImage::save(QIODevice*, const char*, int) const
modules\classes\mainwindow.cpp:3593: error: no matching function for call to 'QMovie::QMovie(QBuffer**)'
..\..\Qt\2010.04\qt\include\QtGui/../../src/gui/image/qmovie.h:152: note: candidates are: QMovie::QMovie(const QMovie&)
..\..\Qt\2010.04\qt\include\QtGui/../../src/gui/image/qmovie.h:94: note: QMovie::QMovie(const QString&, const QByteArray&, QObject*)
..\..\Qt\2010.04\qt\include\QtGui/../../src/gui/image/qmovie.h:93: note: QMovie::QMovie(QIODevice*, const QByteArray&, QObject*)
..\..\Qt\2010.04\qt\include\QtGui/../../src/gui/image/qmovie.h:92: note: QMovie::QMovie(QObject*)
[/color]


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: GreatSnake от Октябрь 21, 2010, 14:03
Ну дык коли перешел на указатель, то убирай '&' перед buffer.

А ещё лучше - отложи возню с Qt пока не освоишь азы C++.


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: zoro86 от Октябрь 21, 2010, 14:04
Да точно... но картинки нет... ???


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: zoro86 от Октябрь 22, 2010, 05:50
Убрал знак &...
программа компилируется...

Но при запуске опять таки картинка не отображается



Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: zoro86 от Октябрь 22, 2010, 12:28
Вытаскиваю qDebug() << buffer->size();

дает 9634

а размер файла 134023

 ???

что не так...


Название: Re: правильное чтение .gif файлов...и их обновление.
Отправлено: zoro86 от Октябрь 22, 2010, 12:46
Вот на это
Код:
qDebug() << animGif->isValid();
qDebug() << animGif->supportedFormats();

выводит
Код:
false
("gif","mng")

если это что та даст..