2017-02-09 23 views
0

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

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

ответ

0

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

Новая проблема, диаграммы в Qt имеют встроенную утечку памяти.

0

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

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

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

не обязательно получить Изображается макс. Без изменения диапазона максимальная скорость будет протекать прямо с экрана без каких-либо претензий. – granitdev