crossplatform.ru

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

> QPaintEvent, installEventFilter, QPainter, Overpainting
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() приводят к рекурсии, естественно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
igor_bogomolov
  опции профиля:
сообщение 27.5.2009, 11:06
Сообщение #2


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

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

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




Репутация:   29  


Цитата(Kagami @ 27.5.2009, 11:47) *
Можно подумать в эту сторону
Надо посмотреть.


Пока решил так. Работает на ура.
Раскрывающийся текст
bool form::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() == QEvent::Paint) {
        obj->removeEventFilter(this);
        QApplication::sendEvent(obj, event);
        obj->installEventFilter(this);

        QWidget *widget = qobject_cast<QWidget*>(obj);
        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.setPen(Qt::red);
        p.setWindow(r);

        p.drawLine(rect().topLeft(), rect().bottomRight());
        return true;
    }
    return false;
}
:yahoo:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- SABROG   QPaintEvent, installEventFilter, QPainter, Overpainting   26.5.2009, 11:52
- - kwisp   Цитата(SABROG @ 26.5.2009, 12:52) оригина...   26.5.2009, 12:01
- - Litkevich Yuriy   SABROG, первая мысля в слух: Стало быть фильтр выз...   26.5.2009, 12:14
- - SABROG   Цитата(kwisp @ 26.5.2009, 13:01) поясни п...   26.5.2009, 12:15
- - Litkevich Yuriy   Цитата(SABROG @ 26.5.2009, 16:15) Думаю p...   26.5.2009, 12:19
- - SABROG   Через флаг не получилось. Второй paintEvent затира...   26.5.2009, 12:31
- - kwisp   Цитата(SABROG @ 26.5.2009, 13:31) Второй ...   26.5.2009, 12:39
- - SABROG   Цитата(kwisp @ 26.5.2009, 13:39) вообще к...   26.5.2009, 12:51
- - kwisp   Цитата(SABROG @ 26.5.2009, 13:31) В момен...   26.5.2009, 12:53
|- - SABROG   Цитата(kwisp @ 26.5.2009, 13:53) Цитата(S...   26.5.2009, 12:56
- - Litkevich Yuriy   Цитата(SABROG @ 26.5.2009, 16:56) В друго...   26.5.2009, 13:11
|- - SABROG   Цитата(Litkevich Yuriy @ 26.5.2009, 14:11...   26.5.2009, 13:23
- - Litkevich Yuriy   SABROG, для случая не окна, глянь-ка сюда и ещё ...   26.5.2009, 16:00
- - SABROG   До этих мест я добрался уже давно, но никак не мог...   26.5.2009, 16:24
- - kwisp   Цитата(Litkevich Yuriy @ 26.5.2009, 17:00...   26.5.2009, 16:24
- - SABROG   Похоже получается. Как я понял sendEvent вызыва...   26.5.2009, 16:35
- - Litkevich Yuriy   Цитата(SABROG @ 26.5.2009, 20:35) Похоже ...   26.5.2009, 16:42
|- - SABROG   Цитата(Litkevich Yuriy @ 26.5.2009, 17:42...   26.5.2009, 16:46
- - Litkevich Yuriy   а можешь тестовый примерчик вылочить, с минимумом ...   26.5.2009, 16:48
|- - SABROG   Цитата(Litkevich Yuriy @ 26.5.2009, 17:48...   26.5.2009, 16:50
- - SABROG   Накатал простенький пример. Правда не самый удачны...   26.5.2009, 18:25
- - SABROG   Господа, поздравьте меня. Наконец-то я это сделал:   26.5.2009, 19:22
- - DmP   SABROG, сорри за офтоп, но чем делаются такие карт...   26.5.2009, 19:47
|- - SABROG   Цитата(DmP @ 26.5.2009, 20:47) SABROG, со...   26.5.2009, 20:34
- - igor_bogomolov   Может я что то делаю не так, но нарисовать что то ...   26.5.2009, 22:09
- - SABROG   Я об этом думал и хотел попробовать завтра такую ш...   26.5.2009, 22:28
- - igor_bogomolov   Цитата(SABROG @ 26.5.2009, 23:28) - после...   26.5.2009, 22:40
- - kwisp   igor_bogomolov, на каждом виджете в отдельности п...   27.5.2009, 7:23
- - SABROG   Цитата(igor_bogomolov @ 26.5.2009, 23:40)...   27.5.2009, 8:51
- - igor_bogomolov   Цитата(kwisp @ 27.5.2009, 8:23) на каждом...   27.5.2009, 8:52
- - kwisp   Цитата(igor_bogomolov @ 27.5.2009, 9:52) ...   27.5.2009, 9:01
- - igor_bogomolov   Цитата(SABROG @ 27.5.2009, 9:51) если уст...   27.5.2009, 9:32
- - kwisp   igor_bogomolov, готово проблема в viewport() он в...   27.5.2009, 10:20
- - igor_bogomolov   kwisp, все правильно. Сам только что до этого доду...   27.5.2009, 10:32
- - Kagami   Можно подумать в эту сторону Раскрывающийся текстЦ...   27.5.2009, 10:47
- - igor_bogomolov   Цитата(Kagami @ 27.5.2009, 11:47) Можно п...   27.5.2009, 11:06
- - igor_bogomolov   RE: QPaintEvent, installEventFilter, QPainter, Overpainting   27.5.2009, 11:54
- - SABROG   В общем затык на отрисовке чайлдов. Как я понял сх...   27.5.2009, 12:30
- - igor_bogomolov   Цитата(SABROG @ 27.5.2009, 13:30) В общем...   27.5.2009, 12:59
|- - SABROG   Цитата(igor_bogomolov @ 27.5.2009, 13:59)...   27.5.2009, 13:19
- - igor_bogomolov   У меня на сегодня уже перенагрузка мозга пошла. Во...   27.5.2009, 13:50
- - SABROG   Виджет.   27.5.2009, 14:05
- - Litkevich Yuriy   Цитата(SABROG @ 26.5.2009, 23:22) Господа...   27.5.2009, 14:41
|- - SABROG   Цитата(Litkevich Yuriy @ 27.5.2009, 15:41...   27.5.2009, 14:56
- - igor_bogomolov   Тебя смущает двойной вызов обработчика события рис...   27.5.2009, 15:00
- - SABROG   Цитата(igor_bogomolov @ 27.5.2009, 16:00)...   27.5.2009, 15:12
- - Litkevich Yuriy   SABROG, я к тому, что вроде была для этого отдельн...   27.5.2009, 15:28
- - igor_bogomolov   Я думаю, другого способа мы не найдем. Дело в том,...   27.5.2009, 16:33
- - Litkevich Yuriy   а что если после собственного рисования, запрещать...   27.5.2009, 17:01
|- - SABROG   Цитата(Litkevich Yuriy @ 27.5.2009, 18:01...   27.5.2009, 17:32
- - Litkevich Yuriy   а есть ещё такая штука как двойная буферизация, её...   27.5.2009, 17:49
|- - SABROG   Цитата(Litkevich Yuriy @ 27.5.2009, 18:49...   27.5.2009, 17:58
- - igor_bogomolov   Цитата(Litkevich Yuriy @ 27.5.2009, 18:49...   27.5.2009, 17:57
- - igor_bogomolov   SABROG, да объясни же, чем не устраивает полученно...   27.5.2009, 18:02
|- - SABROG   Цитата(igor_bogomolov @ 27.5.2009, 19:02)...   27.5.2009, 18:11
- - igor_bogomolov   Цитата(SABROG @ 27.5.2009, 19:11) на скри...   27.5.2009, 18:24
- - SABROG   Много чего придумать можно. Тот же эффект падающег...   27.5.2009, 19:48
- - igor_bogomolov   Цитата(SABROG @ 27.5.2009, 15:56) это аль...   27.5.2009, 21:05
- - SABROG   Ладно, чтобы завершить тему, можешь выложить приме...   27.5.2009, 21:12
- - igor_bogomolov   Цитата(SABROG @ 27.5.2009, 22:12) Ладно, ...   27.5.2009, 21:40
- - SABROG   Меня не столько исходники интересуют, сколько скри...   27.5.2009, 22:05
- - igor_bogomolov   Цитата(SABROG @ 27.5.2009, 23:05) Меня не...   28.5.2009, 1:17
- - Litkevich Yuriy   Вот для эфекта затемнения я бы просто палитру окош...   28.5.2009, 4:18
|- - SABROG   Цитата(Litkevich Yuriy @ 28.5.2009, 5:18)...   28.5.2009, 8:23
- - igor_bogomolov   Цитата(SABROG @ 28.5.2009, 9:23) Осталось...   28.5.2009, 8:40
- - Litkevich Yuriy   Цитата(igor_bogomolov @ 28.5.2009, 12:40)...   28.5.2009, 8:58
- - igor_bogomolov   Все поправил. Теперь и анимация работает нормально...   28.5.2009, 11:02
- - SABROG   Написал в wiki как смог, если есть желающие добави...   28.5.2009, 11:20
- - SABROG   wasyota мне дал любопытную ссылочку http://www.qtc...   28.5.2009, 12:52
- - igor_bogomolov   Цитата(SABROG @ 28.5.2009, 13:52) wasyota...   28.5.2009, 13:04
- - SABROG   #ifndef __POSTEVENTFILTER_H #define __POSTEVENTFIL...   28.5.2009, 13:08
- - igor_bogomolov   Цитата(SABROG @ 28.5.2009, 12:20) Написал...   28.5.2009, 13:29
- - Litkevich Yuriy   SABROG, а что если теперь запустить ссылкой в qt-a...   28.5.2009, 13:51
|- - SABROG   Цитата(Litkevich Yuriy @ 28.5.2009, 14:51...   28.5.2009, 13:57
- - Litkevich Yuriy   ну на qt-apps, кто-то утверждал, что задачка не дл...   28.5.2009, 14:21
- - igor_bogomolov   How to sendEvent QPaintEvent ?   28.5.2009, 14:24
|- - SABROG   Цитата(igor_bogomolov @ 28.5.2009, 15:24)...   28.5.2009, 14:38
- - Litkevich Yuriy   Ах, да qtcentre.org, конечно, а не qt-apps   28.5.2009, 14:39
- - SABROG   Вопрос. А ведь QRubberBand тоже рисуется поверх ви...   28.5.2009, 16:44
- - igor_bogomolov   Цитата(SABROG @ 28.5.2009, 17:44) Хуже он...   28.5.2009, 18:17
- - Litkevich Yuriy   igor_bogomolov, Прикольно получилось   28.5.2009, 19:19
- - ViGOur   Цитата(igor_bogomolov @ 28.5.2009, 19:17)...   28.5.2009, 20:06
- - Kagami   igor_bogomolov, выложи, пожалуйста, исходники с му...   28.5.2009, 20:55
- - igor_bogomolov   Цитата(Kagami)igor_bogomolov, выложи, пожалуйста, ...   28.5.2009, 21:15
- - ViGOur   igor_bogomolov, выложил твоего мужика на сайт: htt...   29.5.2009, 7:56
- - igor_bogomolov   Цитата(ViGOur @ 29.5.2009, 8:56) Просто к...   29.5.2009, 9:13
- - Litkevich Yuriy   Цитата(igor_bogomolov @ 29.5.2009, 13:13)...   29.5.2009, 9:18
- - ViGOur   Это я сам дурак, ограничение в запросе стояло, пот...   29.5.2009, 9:23
- - ViGOur   Блин, вот думаю исходник SUBROG'a выкладывать ...   29.5.2009, 19:49
- - igor_bogomolov   Цитата(ViGOur @ 29.5.2009, 8:56) igor_bog...   29.5.2009, 22:31
- - ViGOur   Цитата(igor_bogomolov @ 29.5.2009, 23:31)...   29.5.2009, 23:31
- - Litkevich Yuriy   Цитата(kwisp @ 30.5.2009, 14:42) может во...   30.5.2009, 11:32
- - SABROG   Не должно muzhik'у быть одному, поэтому я скле...   28.10.2009, 23:36
- - SABROG   Это тролли так шутят или они действительно планиру...   30.10.2009, 23:31
- - Litkevich Yuriy   Ну, а почему бы в 5-ке этому не появится (пострисо...   30.10.2009, 23:36
|- - SABROG   Цитата(Litkevich Yuriy @ 31.10.2009, 0:36...   30.10.2009, 23:46
|- - BRE   Цитата(SABROG @ 30.10.2009, 23:46) Ну есл...   30.10.2009, 23:50
- - Litkevich Yuriy   Цитата(BRE @ 31.10.2009, 2:50) Думаю год ...   31.10.2009, 1:23
- - Litkevich Yuriy   Тему разделил: Ализе́ Жакоте   31.10.2009, 13:49
- - Litkevich Yuriy   Может будет интересно: тык   6.11.2009, 4:43
2 страниц V   1 2 >


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


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




RSS Текстовая версия Сейчас: 17.11.2024, 22:59