crossplatform.ru

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

SABROG
  опции профиля:
сообщение 26.5.2009, 11:52
Сообщение #1


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Есть желание рисовать на дочерних окошках, причем хочется оставить их оригинальный render и рисовать поверх уже готовой картинки. Ввиду того, что дочерних элементов может быть сколько угодно, я не могу (а скорее не хочу) унаследоваться от каждого из них. Поэтому я использую installEventFilter.

Получился такой код:

bool MainWindow::eventFilter(QObject *o, QEvent *e)
{
    if (e->type() == QEvent::Paint && o->isWidgetType()) {
        QPaintEvent *pe = (QPaintEvent *)e;
        QWidget *w = (QWidget *)o;
        qDebug() << "painting:" << o;

        QObject::eventFilter(o, e); //пытаемся вызвать оригинальный обработчик, чтобы сам себя нарисовал
        QPainter p(w); // пытаемся нарисовать что-то поверх уже нарисованного
        p.setRenderHint(QPainter::Antialiasing,true);
        p.drawLine(QPointF(0,0),QPointF(20,90));
        return true; //говорим системе, что мы перехватили, чтобы не отправлял событие дальше, а следовательно и не перерисовывал
    } else {
        return QObject::eventFilter(o, e);
    }
}


Но не получается. Если убрать первый QObject::eventFilter(o, e);, то виджет рисуется поверх линии, т.е. она остается на заднем плане. Если оставить, то рисуется вообще только одна линия, оригинального изображения виджета нет. paintEvent вызвать напрямую не могу, т.к. он protected, render() и repaint() приводят к рекурсии, естественно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
11 страниц V  « < 8 9 10 11 >  
Начать новую тему
Ответов (90 - 99)
ViGOur
  опции профиля:
сообщение 29.5.2009, 23:31
Сообщение #91


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Цитата(igor_bogomolov @ 29.5.2009, 23:31) *
Поэтому я и предлогал переименовать.
Вроде как ты автор того исходника, так что дерзай, если есть идеи. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.5.2009, 11:32
Сообщение #92


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

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

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




Репутация:   94  


Цитата(kwisp @ 30.5.2009, 14:42) *
может вообще не стоит русский аналог искать а писать просто по русски оверрисование.
стОит. Надо подумать, здесь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 28.10.2009, 23:36
Сообщение #93


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Не должно muzhik'у быть одному, поэтому я склепал ему бабу.



Решил попробовать схожий метод перехвата эвентов, но уже в глобальном виде - через переопределение QApplication::notify(). Принцип почти такой же за исключением того, что здесь не нужно использовать installEventFilter и рекурсию по детям.

bool MyApplication::notify(QObject *receiver, QEvent *event)
{
    if (QEvent::Paint == event->type() && m_overWidget) {
        bool ret = QApplication::notify(receiver, event);
        QWidget *widget = qobject_cast<QWidget *>(receiver);
        if (!m_overWidget->isAncestorOf(widget))
            return ret;
        QPainter painter(widget);

        QWidget *parent = widget;

        while(parent && parent->parentWidget() && (parent->parentWidget() != m_overWidget))
            parent = parent->parentWidget();

        if (parent != m_overWidget) {
            QPoint point = widget->mapTo(parent, parent->pos());
            QRect rect = widget->rect().translated(point);

            painter.setWindow(rect);
        }

        painter.drawPixmap(m_pix.rect(), m_pix);
        return ret;
    }
    return QApplication::notify(receiver, event);
}


В примере используется .mng анимация с классом QMovie. Есть баги, требующие доработки.

Исходники.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 30.10.2009, 23:31
Сообщение #94


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Это тролли так шутят или они действительно планируют все-таки реализовать подобный функционал в Qt 5.0.0?

http://bugreports.qt.nokia.com/browse/QTBUG-1615
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.10.2009, 23:36
Сообщение #95


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

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

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




Репутация:   94  


Ну, а почему бы в 5-ке этому не появится (пострисованию)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 30.10.2009, 23:46
Сообщение #96


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(Litkevich Yuriy @ 31.10.2009, 0:36) *
Ну, а почему бы в 5-ке этому не появится (пострисованию)


Ну если Qt 4.3.0 вышла в 2007 году, то 5.0.0 выйдет наверно, когда мы будем уже дедушками.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 30.10.2009, 23:50
Сообщение #97


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

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(SABROG @ 30.10.2009, 23:46) *
Ну если Qt 4.3.0 вышла в 2007 году, то 5.0.0 выйдет наверно, когда мы будем уже дедушками.

IMHO, сейчас релизы чаще выходят. Думаю год два.... :)

Сообщение отредактировал BRE - 31.10.2009, 0:04
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.10.2009, 1:23
Сообщение #98


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

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

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




Репутация:   94  


Цитата(BRE @ 31.10.2009, 2:50) *
Думаю год два....
да быстрее и не надо, а то там каки будут.
Да и судя по странице проекта Qt в разделе версии целая куча всего, что отложено на "после 5-ки"
Цитата
4.5.2 1
4.5.3 11
4.5.4 (Next Patch Release) 44
4.6.0 (Next Minor Release) 424
4.6.1 (Next Patch Release) 1
4.6.x 67
4.7.x 10
5.0.0 (Next Major Release) 80
Some future release

Стало быть 5-ки слишком долго ждать не прийдётся. Одно интересно ВинХП похоронят в 5-ке или нет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.10.2009, 13:49
Сообщение #99


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

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

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




Репутация:   94  


Тему разделил: Ализе́ Жакоте
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 6.11.2009, 4:43
Сообщение #100


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

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

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




Репутация:   94  


Может будет интересно: тык
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

11 страниц V  « < 8 9 10 11 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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


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