簡體   English   中英

QTCharts,如何讓圖表在實時數據進入時跟隨 x 軸?

[英]QTCharts, how do I make the chart follow the x-axis as live data comes in?

我正在嘗試制作一個實時讀取數據的圖表。 我從 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 教程,無論如何都是好的,非常難找。

經過一番努力,把東西扔到牆上看看卡住了什么,我發現卷軸不是你應該使用的。 您希望將范圍與您的 x 值聯系起來,並在每次添加數據時更新它。 這確實會強制圖形與數據行一起滾動。

新問題,Qt 中的圖表有一個內置的內存泄漏。

不要滾動,而是嘗試更改 axisX 的最大值。

當你做你的 DrawLine 檢查下一個點是否高於最大值,如果是,則設置一個新的最大值:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM