crossplatform.ru

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

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


Участник
**

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

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




Репутация:   1  


Нужно отображать gif-анимацию поверх картинки. Пробовал идеи из выложенной здесь проги (один из последних исходников Qt) - не получается. Анимация не рисуется поверх элементов управления.
На скрине правее прогресс бара расположен спиннер. Так вот нужно, чтобы он был поверх картинки. (которая ещё правее)
Эскизы прикрепленных изображений
 РЈРјРµРЅСЊС€РµРЅРѕ РґРѕ 35%
Прикрепленное изображение
405 x 276 (22.18 килобайт)
 

Прикрепленные изображения
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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 Рейтинг@Mail.ru Текстовая версия Сейчас: 18.7.2025, 22:38