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

Len*_*and 5 c++ qt updates qt5 qchart

我正在生成一些我想使用QChart和朋友绘制的数据。这是我第一次使用QChart,因此基本上我所做的是复制QLineSeries示例并根据需要进行修改。我当前的代码如下所示:

    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);
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我希望新数据会显示在图形中,但不会显示,因此我的问题是:如何更新图表以显示新数据?换句话说,我应该在注释所在的代码中添加[A]什么?

Erv*_*gyi 7

将值附加到QLineSeries使用运算符<<append方法应重新绘制图形。如果由于某种原因它没有发生,您可以尝试repaintQChartView.

这是一些代码,一旦添加数据上限为每秒最多一次,这些代码将使数据居中:

// 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;
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,正在添加和更新数据,但我必须手动将新数据集中在中心。我冒昧地将详细信息添加到您的答案中。 (2认同)