Задать вопрос
AterCattus
@AterCattus
Люблю быстрый backend

Можно ли в Qt переопределить paintEvent без создания потомка?

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

Есть ли некий финт ушами, по аналогии с SetWindowLong(hWnd, GWL_WNDPROC, &myWndProc) + CallWindowProc() из Win32API.


Заранее спасибо.
  • Вопрос задан
  • 5838 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
mik_os
@mik_os
Можно: doc.qt.digia.com/4.7-snapshot/eventsandfilters.html#event-filters, если вернуть true из eventFilter то paintEvent виджета вызван не будет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
silvansky
@silvansky
Куда хитрее надо действовать, если надо сначала отрисовать то, что хочет сам виджет, а поверх — своё.

К примеру, есть у нас QLabel, и мы хотим перечеркнуть текст красным по диагонали. Тогда надо в eventFilter сделать такой финт ушами:

bool MyClass::eventFilter(QObject *obj, QEvent *evt)
{
    if (evt->type() == QEvent::Paint)
    {
        obj->removeEventFilter(this);
        QApplication::sendEvent(obj, evt);
        obj->installEventFilter(this)
        // наша отрисовка поверх уже нарисованного
        return true;
    }
}


То есть, снимаем фильтр, отрисовываем «родное», включаем фильтр назад, отрисовываем что надо нам.
Ответ написан
AterCattus
@AterCattus Автор вопроса
Люблю быстрый backend
Собственно, фильтр можно задать для уже имеющегося виджета, тогда не придется создавать отдельный класс фильтра:
...
  this->paint_area->installEventFilter(this);
...
bool MainWindow::eventFilter(QObject *target, QEvent *event) {
    if (target == this->paint_area) {
        if (event->type() == QEvent::Paint) {
            this->paintSmth((QPaintEvent*)event);
            return true;
        }
    }

    return false;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы