如何在将数据添加到QLineSeries后更新/重绘QChart?

时间:2017-03-24 23:10:17

标签: c++ qt qt5 updates qchart

我正在生成一些我想要使用 QChart &朋友。这是我第一次使用QChart,基本上我所做的就是复制QLineSeries Example并根据我的需要进行修改。我目前的代码如下:

    quint64 last=0;
    quint64 *lastp=&last;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , series( nullptr )
{
    ui->setupUi(this);
    QChart *chart = new QChart();
    series=new QLineSeries(chart);
    chart->legend()->hide();
    chart->addSeries(series);
    chart->createDefaultAxes();
    chart->setTitle("Simple line chart example");
    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);
    setCentralWidget(chartView);
    GeneticTask *gTask = new GeneticTask();
    connect(gTask, &GeneticTask::point, this, [=](QPointF pt) {
        // New point added to series
        *series<<pt;
        // Limit updates to once per second
        quint64 now=QDateTime::currentMSecsSinceEpoch();
        if(now-(*lastp)>1000) {
            qDebug()<<"UPDATE";
            // [A] WHAT TO PUT HERE TO HAVE CHART REDRAW WITH NEW DATA?
            *lastp=now;
        }
    }
    );
    QThreadPool::globalInstance()->start(gTask);
}

当我运行此代码时,我希望我的新数据显示在图表中,但它没有,所以我的问题是:如何让图表更新以显示新数据?换句话说,我应该在评论中写入[A]的代码中添加什么?

2 个答案:

答案 0 :(得分:3)

使用运算符QLineSeries<<方法将值添加到append应该重新绘制图表。如果由于某种原因没有发生,您可以尝试在repaint上调用QChartView方法。

以下是一些代码,一旦添加了每秒最多一次的数据,它将使数据居中:

// Global or class scope or
qreal max=-10000000000;
qreal min=-max;
qreal *maxp=&max;
qreal *minp=&min;

// Same scope as before
connect(gTask, &GeneticTask::point, this, [=](QPointF pt) {
        if(pt.y()>*maxp) {
            *maxp=pt.y();
        }
        if(pt.y()<*minp) {
            *minp=pt.y();
        }
        *series<<pt;
        quint64 now=QDateTime::currentMSecsSinceEpoch();
        if(now-(*lastp)>1000) {
            qDebug()<<"UPDATE";
            chart->axisX()->setRange(0,series->count());
            chart->axisY()->setRange(*minp,*maxp);

            *lastp=now;
        }
    }
);

答案 1 :(得分:-1)

对以上答案的修正不多。 Qt文档说:

void QWidget::repaint() 通过调用直接重新绘制小部件 立即使用paintEvent(),除非禁用更新或禁用小部件 隐。我们建议仅在需要立即使用时才使用repaint() 重新绘制,例如在动画过程中。在几乎所有情况下 update()更好,因为它允许Qt优化速度和 减少闪烁。
警告:如果您在函数中调用repaint() 可能会从paintEvent()本身调用,您可能会得到无限 递归。 update()函数永远不会导致递归。

结果,QChartView::update()为我工作。