首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在数据添加到QChart后更新/重绘QLineSeries?

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

Stack Overflow用户
提问于 2017-03-24 23:10:16
回答 2查看 18.3K关注 0票数 9

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

代码语言:javascript
复制
    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]的代码中添加什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-24 23:29:19

使用操作符<<append方法将一个值附加到<<中,应该会重新绘制图形。如果没有形成某种原因,您可以尝试在repaint上调用QChartView方法。

下面是一些代码,一旦数据以每秒最多一次的上限进行添加,这些代码将对数据进行中心化:

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

Stack Overflow用户

发布于 2020-08-28 10:33:58

对上面的答案几乎没有修正。Qt文档说:

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

因此,QChartView::update()为我工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43010572

复制
相关文章

相似问题

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