crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Анимация поверх картинки
Elfinit
  опции профиля:
сообщение 21.9.2009, 22:42
Сообщение #1


Участник
**

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

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




Репутация:   1  


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

Прикрепленные изображения
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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 вызывать тоже не интересно, тем более на нём несколько виджетов с аналогичной логикой.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 1.12.2024, 12:24