首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >警告QPainter在paintEvent内

警告QPainter在paintEvent内
EN

Stack Overflow用户
提问于 2018-08-17 22:36:46
回答 1查看 1.1K关注 0票数 2

我试图在QChartView中绘制更多的信息,所以我重新实现了paintEvent。

代码语言:javascript
复制
  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);
    }
}

我要承担这些错误

代码语言:javascript
复制
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,但是我也犯了同样的错误

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-18 01:49:38

不要使用QChartView的子类,而是使用它的视图。

QChartView是从QGraphicsView派生的,而后者又是从QAbstractScrollArea派生的,根据这个答案 (以及引用的文档),您应该使用viewport作为QPainter的画图设备,而不是小部件本身。

所以,而不是

代码语言:javascript
复制
QPainter painter(this);

QPainter painter(viewport());

QGraphicsView的来源中也可以看到同样的情况,即:

代码语言:javascript
复制
// Set up the painter
QPainter painter(viewport());
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51903613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档