LINUX.ORG.RU

Компилируется, но не работает пример из документации по QPainter

 ,


0

1

В документации на QPainter Qt 5.4.2 написан следующий пример:

void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 30));
    painter.drawText(rect(), Qt::AlignCenter, "Qt");
}

Такое переопределение метода paintEvent() должно нарисовать строку «Qt» в центре виджета.
Вместо этого в логе пишется:
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QPainter::setFont: Painter not active

Как побороть?

★★★★★

Попробуйте добавить вызов paintEvent базового класса с этим же событием в начало метода, должно помочь.

anonymous ()
Ответ на: комментарий от RazrFalcon

Раскрою немного вашу мысль: все, что наследуется от QAbstractScrollArea, требует вызова painter-а на viewport(), а не на this, потому что отрисовка на самом деле выполняется на viewport-е. QAbstractScrollArea заворачивает paintEvent и целый список других событий от viewport-а в сам виджет:

For convenience, QAbstractScrollArea makes all viewport events available in the virtual viewportEvent() handler. QWidget's specialized handlers are remapped to viewport events in the cases where this makes sense. The remapped specialized handlers are: paintEvent(), mousePressEvent(), mouseReleaseEvent(), mouseDoubleClickEvent(), mouseMoveEvent(), wheelEvent(), dragEnterEvent(), dragMoveEvent(), dragLeaveEvent(), dropEvent(), contextMenuEvent(), and resizeEvent().

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.