Получился такой код:
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() приводят к рекурсии, естественно.