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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: правильное чтение .gif файлов...и их обновление.  (Прочитано 10637 раз)
zoro86
Гость
« : Октябрь 21, 2010, 08:54 »

Всем привет...

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

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

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

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Октябрь 21, 2010, 09:04 »

Загрузи файл в QBuffer и уже его скорми в

QMovie( QIODevice * device, const QByteArray & format = QByteArray(), QObject * parent = 0 )
Записан

Qt 5.11/4.8.7 (X11/Win)
zoro86
Гость
« Ответ #2 : Октябрь 21, 2010, 09:23 »

Так понятно... а как это реализовать....

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

Как в буфер записать картинку?
Записан
merke
Гость
« Ответ #3 : Октябрь 21, 2010, 09:40 »

Код:
     QImage image("test.gif");
      QByteArray ba;
      QBuffer buf(&ba);
      image.save(&buf, "GIF");
Записан
zoro86
Гость
« Ответ #4 : Октябрь 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
Непонимающий
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Октябрь 21, 2010, 10:00 »

Ну дык ёлы-палы...
Зачем делаете присваивание "QIODevice *dev1 = buffer;"?
Отдавайте buffer на вход QMovie.

Хм, извиняюсь, но какой-то вы странный "самовар", коли делаете такие детские ошибки - пытаетесь получить указатель без '&'.
« Последнее редактирование: Октябрь 21, 2010, 10:04 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
zoro86
Гость
« Ответ #6 : Октябрь 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*)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Октябрь 21, 2010, 10:07 »

мде...

QMovie *animGif = new QMovie(&buffer);

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

Qt 5.11/4.8.7 (X11/Win)
zoro86
Гость
« Ответ #8 : Октябрь 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();

Картинки нету... что делаю не так..
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Октябрь 21, 2010, 11:32 »

Цитировать
Картинки нету... что делаю не так..
QBuffer создали на стэке... Азы однако...
Записан

Qt 5.11/4.8.7 (X11/Win)
zoro86
Гость
« Ответ #10 : Октябрь 21, 2010, 11:46 »

Я только начал QBuffer юзать, так что поясните смысл для не просвященных
Цитировать
QBuffer создали на стэке... Азы однако...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Октябрь 21, 2010, 11:50 »

При выходе из текущего скопа объект QBuffer будет уничтожен.
Это не Qt - это С++!
Записан

Qt 5.11/4.8.7 (X11/Win)
merke
Гость
« Ответ #12 : Октябрь 21, 2010, 13:22 »

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

А уже в своей функцие делай следую 
Код:
buffer.open(QBuffer::ReadWrite);
и так далее...
Записан
zoro86
Гость
« Ответ #13 : Октябрь 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]
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #14 : Октябрь 21, 2010, 14:03 »

Ну дык коли перешел на указатель, то убирай '&' перед buffer.

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

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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