我正在尝试制作一个实时读取数据的图表。我从Qt提供的名为“动态样条”的示例开始。
我遇到的问题是,scroll()函数似乎可以滚动像素,而Qt中似乎没有任何函数可以与数据一起滚动。因此,除非我的pixes滚动计数准确无误,否则要么我的绘图线增长,直到末端不再可见,要么图表通过留下绘图线继续滚动。
对我来说,这似乎是一个每个人都会在动态图表中使用的相当明显的功能,所以我不得不问这样一个问题: Qt图表中我错过了什么功能来做到这一点?
我所有的搜索都是徒劳的,我甚至找不到如何在Qt图表中使用动态数据收集的教程。
#include "chart.h"
#include <QtCharts/QAbstractAxis>
#include <QtCharts/QSplineSeries>
#include <QtCharts/QValueAxis>
#include <QtCore/QTime>
#include <QtCore/QDebug>
Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags):
QChart(QChart::ChartTypeCartesian, parent, wFlags),
m_series(0),
m_axis(new QValueAxis),
m_step(0),
m_x(10),
m_y(1)
{
qsrand((uint) QTime::currentTime().msec());
QObject::connect(&m_timer, SIGNAL(timeout()), this, SLOT(drawChart()));
m_timer.setInterval(1000);
m_series = new QSplineSeries(this);
QPen green(Qt::red);
green.setWidth(3);
m_series->setPen(green);
m_series->append(m_x, m_y);
addSeries(m_series);
createDefaultAxes();
setAxisX(m_axis, m_series);
// m_axis->setTickCount(11);
axisX()->setRange(0, 100);
axisY()->setRange(-5, 10);
m_timer.start();
elapsedTime.start();
}
Chart::~Chart()
{
}
void Chart::drawLine(qreal &x, qreal &y)
{
m_series->append(x, y);
}
qreal Chart::getTime()
{
return elapsedTime.elapsed() / 100;
}
void Chart::drawChart()
{
qreal x = plotArea().width() / m_axis->tickCount();
qreal y = (m_axis->max() - m_axis->min()) / m_axis->tickCount();
m_x = getTime();
m_y = qrand() % 5 - 2.5;
drawLine(m_x, m_y);
scroll(x, 0);
qDebug() << getTime();
}代码非常简单,现在它正在绘制,但线条和滚动完全脱离了水槽。因为我想使用时间作为我的X轴,并且不能使用设置示例时不可伸缩的方式。
现在它只是绘制了一个随机数。在我把这个滚动的东西整理好之前,我不会费心给它提供实际数据。
提前感谢你的帮助。如果你知道一些关于Qt图表的很好的教程,我将非常感谢。Qt教程,不管怎么说都很好,很难找到。
发布于 2017-02-12 09:32:06
在花了很大力气,把东西扔到墙上,看看什么东西粘住了之后,我发现scroll不是你应该使用的。您希望将范围绑定到x值,并在每次添加数据时对其进行更新。这确实会强制图形像以前一样滚动,以及数据线。
新问题,Qt中的图表有一个内置的内存泄漏。
发布于 2017-02-24 23:41:49
尝试更改axisX的最大值,而不是滚动。
在执行DrawLine时,检查下一个点是否高于最大值,如果是,则设置新的最大值:
if (m_x > m_axisX->max())
{
m_axisX->setMax(m_x);
}https://stackoverflow.com/questions/42147724
复制相似问题