【问题标题】:How to update/redraw QChart after data is added to QLineSeries?将数据添加到 QLineSeries 后如何更新/重绘 QChart?
【发布时间】:2017-03-24 23:10:16
【问题描述】:

我正在生成一些我想使用 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] 的代码中输入什么?

【问题讨论】:

    标签: c++ qt qt5 updates qchart


    【解决方案1】:

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

    这里有一些代码,一旦添加数据,它将以每秒最多一次的上限为中心:

    // 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;
            }
        }
    );
    

    【讨论】:

    • 请注意,正在添加和更新数据,但我必须手动以新数据为中心。我冒昧地在您的答案中添加了详细信息。
    • 也可以使用chart->createDefaultAxes();
    【解决方案2】:

    对上面的答案稍作修正。 Qt 文档说:

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      相关资源
      最近更新 更多