在 paintEvent 中警告 QPainter

Warning QPainter inside paintEvent

我试图在 QChartView 中绘制更多信息,所以我重新实现了 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);
    }
}

我正在接受这些错误

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

对此有什么想法吗?我也用过 painter.begin 和结束,但我犯了同样的错误

不要在 QChartView 的子类上绘制,而是在其视口上绘制。

QChartView is derived from QGraphicsView, which in turn is derived from QAbstractScrollArea and according to (as well as the cited there documentation) 您应该将视口用作 QPainter 的绘图设备,而不是小部件本身。

所以,而不是

QPainter painter(this);

QPainter painter(viewport());

source of QGraphicsView中也可以看到同样的情况,即:

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