我正在生成一些我想要使用 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]
的代码中添加什么?
答案 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()
为我工作。