【问题标题】:Warning QPainter inside paintEvent [duplicate]在paintEvent中警告QPainter [重复]
【发布时间】:2018-08-17 22:36:46
【问题描述】:

我尝试在 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 和end 但我犯了同样的错误

【问题讨论】:

    标签: c++ qt qt5 qpainter qchartview


    【解决方案1】:

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

    QChartView 派生自 QGraphicsView,而 QAbstractScrollArea 又派生自 this answer(以及那里引用的 documentation),您应该使用视口作为您的绘图设备QPainter,而不是小部件本身。

    所以,而不是

    QPainter painter(this);
    

    QPainter painter(viewport());

    同样可以在source of QGraphicsView中看到,即:

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

    【讨论】:

    • 是的,它现在可以工作了!
    • 我很高兴听到这个消息。
    • 我以为我已经做到了:D
    • @chatzich,谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 2016-09-23
    • 2013-02-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多