crossplatform.ru

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

Elfinit
  опции профиля:
сообщение 21.9.2009, 22:42
Сообщение #1


Участник
**

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

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




Репутация:   1  


Нужно отображать gif-анимацию поверх картинки. Пробовал идеи из выложенной здесь проги (один из последних исходников Qt) - не получается. Анимация не рисуется поверх элементов управления.
На скрине правее прогресс бара расположен спиннер. Так вот нужно, чтобы он был поверх картинки. (которая ещё правее)
Эскизы прикрепленных изображений
 Р В Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 35%
Прикрепленное изображение
405 x 276 (22.18 килобайт)
 

Прикрепленные изображения
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 11)
ufna
  опции профиля:
сообщение 21.9.2009, 23:27
Сообщение #2


Активный участник
***

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

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




Репутация:   5  


а как пытаешься рисовать? покажи код
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 21.9.2009, 23:32
Сообщение #3


Участник
**

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

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




Репутация:   1  


Сейчас гифка рисуется тупо в связке QLabel+QMovie. Пытался рисовать в paintEvent через painter.drawImage.
В конструкторе виджета создавал QImageReader reader, который каждые 200 миллисекунд читал QImage img, который и рисовался в paintEvent.
(Код я из проги выкинул, поэтому на словах. Вообще же он полностью был содран отсюда: http://www.crossplatform.ru/node/887
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.9.2009, 0:14
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(Elfinit @ 22.9.2009, 2:42) *
Анимация не рисуется поверх элементов управления.
в пиведённой ссылке гифка рисуется поверх кнопки.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 22.9.2009, 7:37
Сообщение #5


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Elfinit,
давай код с кодом примера сравнивать. :mellow:
может действительно в новой версии Qt что то изменили во вред, хотя очень сомневаюсь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 22.9.2009, 19:01
Сообщение #6


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

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

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




Репутация:   29  


muzhik.zip ( 24,15 килобайт ) Кол-во скачиваний: 270 :)

Elfinit,
Проверил у себя с приведённым выше рисунком. Все работает. Хотя, на мой взгляд, это не самый лучший выход из ситуации, Лучше всё таки использовать прозрачный виджет. Почитай это , там SABROG все отлично описал, и соответствующие ссылочки приложил )))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.9.2009, 19:34
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(igor_bogomolov @ 22.9.2009, 23:01) *
muzhik...Кол-во скачиваний: 270
а в России без мужика никуда :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 22.9.2009, 21:59
Сообщение #8


Участник
**

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

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




Репутация:   1  


Проверил ещё раз, теперь анимация вообще пропала...
Итак, куски кода.
Из конструктора виджета:
PhotoSender::PhotoSender(const QString &title, const QList<PhotoData*> &photos, QWidget *parent) :
    QFrame(parent),
    m_ui(new Ui::PhotoSender)
{
    ...

    StyledWidget::childsRecursive(m_ui->lblPreview,this,true);
    spinnerImageReader.setFileName("./i/spinner.gif");
    framesCounter = 1;
    QTimer *timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(updateSpinner()));
    timer->start(300);
}


eventFilter, updateSpinner:
bool PhotoSender::eventFilter(QObject *obj, QEvent *evt)
{
    if (evt->type() == QEvent::Paint)
    {
        QWidget *widget = qobject_cast<QWidget*>(obj);
        widget->setAutoFillBackground(false);
        obj->removeEventFilter(this);
        QApplication::sendEvent(obj, evt);
        obj->installEventFilter(this);
        widget->setAutoFillBackground(true);

        QPoint point = widget->pos();
        while (widget && (widget->parentWidget() != this))
        {
            widget = widget->parentWidget();
            point += widget->pos();
        }

        QRect r = (qobject_cast<QWidget*>(obj))->rect().translated(point);

        QPainter p(qobject_cast<QWidget*>(obj));
        p.setWindow(r);
                p.drawImage(0,0,spinnerImage);
        return true;
    }
    return false;
}

void PhotoSender::updateSpinner()
{
    if (spinnerImageReader.canRead())
    {
        spinnerImage = spinnerImageReader.read();
    }
    else
    {
        return;
    }
    update();

    framesCounter++;
    if (10 == framesCounter)
    {
        framesCounter = 1;
        spinnerImageReader.setFileName("./i/spinner.gif");
    }
}


childsRecursive:
/* static */
void StyledWidget::childsRecursive(QObject *object, QWidget *watcher, bool install)
{
    if (object->isWidgetType())
    {
        if (install)
        {
            object->installEventFilter(watcher);
        }
        else
        {
            object->removeEventFilter(watcher);
        }
        QWidget *widget = qobject_cast<QWidget*>(object);
        widget->setAutoFillBackground(true);
    }
    QObjectList children = object->children();
    foreach(QObject *child, children)
    {
        StyledWidget::childsRecursive(child, watcher, install);
    }
}


Сообщение отредактировал Elfinit - 22.9.2009, 22:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 23.9.2009, 0:29
Сообщение #9


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

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

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




Репутация:   29  


Не знаю как средствами qt узнать количество кадров в gif, но у тебя их точно не 10. Если указать больше чем есть, работать не будет. Я для эксперимента с твоим рисунком ставил 8. )))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 23.9.2009, 10:31
Сообщение #10


Участник
**

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

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




Репутация:   1  


Цитата(igor_bogomolov @ 23.9.2009, 1:29) *
Не знаю как средствами qt узнать количество кадров в gif, но у тебя их точно не 10. Если указать больше чем есть, работать не будет. Я для эксперимента с твоим рисунком ставил 8. )))

Не помогло. А ничего, что я childRecursive вызываю для лэйбла только? Если вызывать для всего виджета, прога элегантно падает.
Для parent вызывать тоже не интересно, тем более на нём несколько виджетов с аналогичной логикой.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 23.9.2009, 23:40
Сообщение #11


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

Группа: Сомодератор
Сообщений: 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 килобайт ) Кол-во скачиваний: 115
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 24.9.2009, 12:09
Сообщение #12


Участник
**

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

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




Репутация:   1  


О, всё заработало)) Спасибо)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 16.7.2025, 7:17