QTCharts, как мне заставить диаграмму следовать оси X при поступлении оперативных данных?

Я пытаюсь сделать диаграмму, которая читает данные в реальном времени. Я начал с примера, предоставленного Qt под названием «динамический сплайн».

Проблема, с которой я столкнулся, заключается в том, что функция scroll (), по-видимому, прокручивает пиксели, и в Qt, похоже, нет какой-либо функции, которую я могу найти, которая прокручивает вместе с данными. Поэтому, если я не получу точный счетчик прокрутки пикселей, либо моя линия графика будет расти до тех пор, пока конец больше не будет виден, либо диаграмма будет прокручиваться, оставляя линию графика позади.

Мне кажется, это довольно очевидная особенность, которую каждый использовал бы с динамической диаграммой, поэтому я оставляю вопрос: какая функция в диаграммах 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, во всяком случае, хорошие, найти крайне сложно.

1

Решение

После долгих усилий и броска предметов в стену, чтобы увидеть, что застряло, я обнаружил, что свиток не то, что вы должны использовать. Вы хотите связать диапазон с вашим значением x и обновлять его каждый раз, когда добавляете данные. Это заставляет график прокручиваться как бы вместе со строкой данных.

Новая проблема, у Charts в Qt есть утечка памяти.

0

Другие решения

Вместо прокрутки попробуйте изменить максимальное значение axisX.

Когда вы проводите DrawLine, проверьте, больше ли следующая точка, чем max, и установите новый максимум, если да:

if (m_x > m_axisX->max())
{
m_axisX->setMax(m_x);
}
0

По вопросам рекламы [email protected]