Warning QPainter inside paintEvent [duplicate]

两盒软妹~` 提交于 2019-12-31 06:18:09

问题


I tried to draw some more information in QChartView so I re-implement paintEvent

  virtual void paintEvent(QPaintEvent *event) {
    QChartView::paintEvent(event);
    OmenChart *mchr = dynamic_cast<OmenChart *>(this->chart());
    if(mchr == nullptr)
        return;
    QPainter painter(this);

    const int labelOffset = 2 + 2;
    painter.setFont(this->font());
    painter.setPen(QPen(Qt::black));
    QFontMetrics fm(painter.font());


    const OmenScatterSeries *omnSr = mchr->serie();
    QVector<QPointF> points = omnSr->pointsVector();
    QStringList labels = omnSr->pointLabels();

    for (int i(0); i < labels.count(); i++) {
        QString pointLabel = labels[i];

        // Position text in relation to the point
        int pointLabelWidth = fm.width(pointLabel);
        QPointF position(points.at(i));
        position.setX(position.x() - pointLabelWidth / 2);
        position.setY(position.y() - labelOffset);
        painter.drawText(position, pointLabel);
    }
}

and I am taking these errors

QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setFont: Painter not active
QPainter::setPen: Painter not active
QPainter::font: Painter not active
QWidget::paintEngine: Should no longer be called

Any ideas on this ? I had also used painter.begin and end but I took the same errors


回答1:


Do not draw on your subclass of QChartView, but instead on its viewport.

QChartView is derived from QGraphicsView, which in turn is derived from QAbstractScrollArea and according to this answer (as well as the cited there documentation) you should use the viewport as a paint device for your QPainter, not the widget itself.

So, instead of

QPainter painter(this);

write

QPainter painter(viewport());

The same could be seen in the source of QGraphicsView, i.e.:

// Set up the painter
QPainter painter(viewport());


来源:https://stackoverflow.com/questions/51903613/warning-qpainter-inside-paintevent

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!