crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Анимация поверх картинки
Elfinit
  опции профиля:
сообщение 21.9.2009, 22:42
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


Нужно отображать gif-анимацию поверх картинки. Пробовал идеи из выложенной здесь проги (один из последних исходников Qt) - не получается. Анимация не рисуется поверх элементов управления.
На скрине правее прогресс бара расположен спиннер. Так вот нужно, чтобы он был поверх картинки. (которая ещё правее)
Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные изображения
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
igor_bogomolov
  опции профиля:
сообщение 23.9.2009, 23:40
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Если тебе не нужно рисовать поверх нескольких виджетов одновременно, а только поверх лейбла, задача сильно упрощается. Никакой childRecursive тебе не нужен (прочитай еще раз внимательно статью по ссылке выше).

Создай собственный виджет, примерно так
.h
#ifndef FORM_H
#define FORM_H

#include <QtGui/QLabel>

class MyLabel : public QLabel
{
    Q_OBJECT
    Q_DISABLE_COPY(MyLabel);
public:
    MyLabel(QWidget *parent = 0);
protected:
    bool eventFilter(QObject *obj, QEvent *event);
private slots:
    void myslot2(int frame);
private:
    QMovie* movie;
    QImage image;
};

#endif // FORM_H
.cpp
#include <QtGui>
#include "form.h"

#include <QtDebug>

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
    setPixmap(QPixmap("logo.gif"));
    setScaledContents(true);

    setAutoFillBackground(false);
    installEventFilter(this);

    movie = new QMovie("post.gif", "gif", this);
    connect(movie, SIGNAL(frameChanged(int)), this, SLOT(myslot2(int)));

    movie->start();
}

bool MyLabel::eventFilter(QObject *obj, QEvent *event)
{
    if( (event->type() == QEvent::Paint) && (obj == this) ) {
        removeEventFilter(this);
        QApplication::sendEvent(obj, event);
        installEventFilter(this);

        QPainter p(qobject_cast<QWidget*>(obj));
        p.drawImage(rect().center() - movie->frameRect().bottomRight(), image);
        return true;
    }
    return false;
}

void MyLabel::myslot2(int)
{
    image = movie->currentImage();
    update();
}
main.cpp
#include <QtGui/QApplication>
#include "form.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyLabel frm;
    frm.show();
    return a.exec();
}
и используй его в своем приложении. (post.gif - это твоя gif)...

Прикрепляю рабочий примерчик, дальше сам для себя допилишь )))
Прикрепленные файлы
Прикрепленный файл  test.tar ( 40 килобайт ) Кол-во скачиваний: 97
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2024, 19:31