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  « < 6 7 8 9 10 > »   
Начать новую тему
Ответов (70 - 79)
SABROG
  опции профиля:
сообщение 28.5.2009, 13:08
Сообщение #71


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

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

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




Репутация:   34  


#ifndef __POSTEVENTFILTER_H
#define __POSTEVENTFILTER_H

#include <QList>
#include <QEvent>

#define WW_POSTEVENTFILTER(superclass) \
public: \
void installPostEventFilter(QObject *monitor){ \
  postFilters.push_front(monitor); \
} \
void removePostEventFilter(QObject *monitor){ \
  postFilters.removeAll(monitor); \
} \
private: \
QList<QObject*> postFilters; \
protected: \
  bool event(QEvent *e){ \
    bool ret = superclass::event(e); \
    if(!ret) \
      return false; \
    foreach(QObject *o, postFilters){ \
    bool r; \
    QMetaObject::invokeMethod(o, "postEventFilter", Qt::DirectConnection, Q_RETURN_ARG(bool, r), Q_ARG(QObject*, this), Q_ARG(QEvent*, e)); \
    if(r) return true; \
    } \
    return true; \
  }

#endif
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 28.5.2009, 13:29
Сообщение #72


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

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

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




Репутация:   29  


Цитата(SABROG @ 28.5.2009, 12:20) *
Написал в wiki как смог, если есть желающие добавить или поправить - милости прошу.
Хорошая статья получилась. Не зря мучились почти три дня.

Еще бы ссылочку на эту дему добавить, если вдруг кто то захочет задать вопросс.

Сообщение отредактировал igor_bogomolov - 28.5.2009, 13:32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.5.2009, 13:51
Сообщение #73


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

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

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




Репутация:   94  


SABROG, а что если теперь запустить ссылкой в qt-apps?
(через гугл переводчик)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 28.5.2009, 13:57
Сообщение #74


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

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

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




Репутация:   34  


Цитата(Litkevich Yuriy @ 28.5.2009, 14:51) *
SABROG, а что если теперь запустить ссылкой в qt-apps?
(через гугл переводчик)

Поподробней отсюда, я ничего не понял :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.5.2009, 14:21
Сообщение #75


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

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

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




Репутация:   94  


ну на qt-apps, кто-то утверждал, что задачка не для Qt. Если я ничего не перепутал.
Дак вот дать им ссылку на нашу вики, типа вот как всё это можно сделать.
Дать ссылку на оригинал и на гугловский перевод, чтоб по аглицки могли почитать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 28.5.2009, 14:24
Сообщение #76


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

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

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




Репутация:   29  


How to sendEvent QPaintEvent ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 28.5.2009, 14:38
Сообщение #77


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

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

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




Репутация:   34  


Цитата(igor_bogomolov @ 28.5.2009, 15:24) *


:) не совсем эта тема, она просто стала продолжением этой: http://www.qtcentre.org/forum/f-qt-program...ilds-21153.html

Щас обновлю все-таки последнюю тему, добавлю туда ссылочку.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.5.2009, 14:39
Сообщение #78


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

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

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




Репутация:   94  


Ах, да qtcentre.org, конечно, а не qt-apps
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 28.5.2009, 16:44
Сообщение #79


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

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

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




Репутация:   34  


Вопрос. А ведь QRubberBand тоже рисуется поверх виджетов?
---
Вопрос отпал, это тот самый прослойчатый виджет:

    setAttribute(Qt::WA_TransparentForMouseEvents);
#ifndef Q_WS_WIN
    setAttribute(Qt::WA_NoSystemBackground);
#endif //Q_WS_WIN
    setAttribute(Qt::WA_WState_ExplicitShowHide);

---
Отличие PostEventFilter'а от нашего метода в том, что там переопределяется метод event() вместо installEventFilter'a, ну и соответственно вызывается сначала оригинальный обработчик, а после него вызывается метод postEventFilter. Хуже он тем, что работает только на одном виджете и соответственно каждый такой виджет надо наследовать.

Сообщение отредактировал SABROG - 28.5.2009, 16:56
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 28.5.2009, 18:17
Сообщение #80


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

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

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




Репутация:   29  


Цитата(SABROG @ 28.5.2009, 17:44) *
Хуже он тем, что работает только на одном виджете и соответственно каждый такой виджет надо наследовать.
Такой метод нам явно не подходит. Наш метод однозначно лучше. Твою статью можно смело в QQ размещать :D


--------------------------------------------------------------------------------
Наконец то научился работать с гиф анимацией через Qt, не воспроизводя ее в QLabel.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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