最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用Qt實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)動(dòng)態(tài)繪制的折線(xiàn)圖效果

 更新時(shí)間:2024年10月09日 09:29:09   作者:極客晨風(fēng)  
使用Qt的QChartView和定時(shí)器,本教程詳細(xì)介紹了如何動(dòng)態(tài)繪制折線(xiàn)圖,通過(guò)定時(shí)器觸發(fā)數(shù)據(jù)點(diǎn)的動(dòng)態(tài)添加和坐標(biāo)軸范圍的自動(dòng)調(diào)整,實(shí)現(xiàn)了實(shí)時(shí)更新數(shù)據(jù)的動(dòng)態(tài)折線(xiàn)圖應(yīng)用,程序結(jié)合QLineSeries或QSplineSeries繪制折線(xiàn)或樣條曲線(xiàn),配合動(dòng)畫(huà)效果,展現(xiàn)數(shù)據(jù)變化

基于Qt的 QChartView 和定時(shí)器來(lái)動(dòng)態(tài)繪制折線(xiàn)圖。它通過(guò)動(dòng)畫(huà)的方式逐步將數(shù)據(jù)點(diǎn)添加到圖表上,并動(dòng)態(tài)更新坐標(biāo)軸的范圍,提供了一個(gè)可以實(shí)時(shí)更新數(shù)據(jù)的折線(xiàn)圖應(yīng)用。以下是對(duì)代碼的詳細(xì)介紹及其功能解析:

在這里插入圖片描述

代碼概述

該程序使用Qt的 QChartView 作為圖表繪制的基礎(chǔ),結(jié)合 QLineSeriesQSplineSeries 來(lái)繪制折線(xiàn)或樣條曲線(xiàn)。程序通過(guò)定時(shí)器 (QTimer) 控制數(shù)據(jù)點(diǎn)的動(dòng)態(tài)繪制,并在繪圖過(guò)程中實(shí)時(shí)更新坐標(biāo)軸的顯示范圍。

主要功能

  • 動(dòng)態(tài)創(chuàng)建系列:可以動(dòng)態(tài)創(chuàng)建多個(gè)曲線(xiàn)系列(QLineSeriesQSplineSeries),每個(gè)系列對(duì)應(yīng)一條折線(xiàn)或樣條曲線(xiàn)。
  • 動(dòng)態(tài)添加數(shù)據(jù)點(diǎn):通過(guò) addPointAnimated() 函數(shù),可以為每個(gè)系列動(dòng)態(tài)添加數(shù)據(jù)點(diǎn),并通過(guò)動(dòng)畫(huà)效果逐步連接新數(shù)據(jù)點(diǎn)。
  • 定時(shí)更新:使用 QTimer 每隔一段時(shí)間調(diào)用 animateDrawing() 函數(shù),逐步將新點(diǎn)連接到已有的曲線(xiàn)上。
  • 自動(dòng)調(diào)整坐標(biāo)軸范圍:在繪制過(guò)程中,如果新點(diǎn)超出了當(dāng)前坐標(biāo)軸范圍,坐標(biāo)軸會(huì)自動(dòng)調(diào)整以適應(yīng)新的數(shù)據(jù)點(diǎn)。

代碼結(jié)構(gòu)

1. DynamicChart 類(lèi)構(gòu)造函數(shù)

DynamicChart::DynamicChart(QWidget *parent)
    : QChartView(new QChart(), parent), m_chart(this->chart())
{
    m_chart->setTitle("Dynamic Data Plot");
    m_chart->legend()->hide();
    setRenderHint(QPainter::Antialiasing);
    // 設(shè)置圖表主題和隱藏圖例
    m_chart->setTheme(QChart::ChartTheme::ChartThemeDark);
    // 創(chuàng)建共用的坐標(biāo)軸
    axisX = new QValueAxis();
    axisX->setRange(0, 100);
    m_chart->addAxis(axisX, Qt::AlignBottom);
    axisY = new QValueAxis();
    axisY->setRange(0, 100);
    m_chart->addAxis(axisY, Qt::AlignLeft);
    // 設(shè)置定時(shí)器
    connect(&timer, &QTimer::timeout, this, &DynamicChart::animateDrawing);
    timer.setInterval(30); // 動(dòng)畫(huà)更新間隔為30毫秒
    resize(500,500);
}

該構(gòu)造函數(shù)中設(shè)置了圖表的主題、坐標(biāo)軸、以及定時(shí)器,定時(shí)器的作用是每隔30毫秒觸發(fā) animateDrawing() 函數(shù),用于動(dòng)態(tài)繪制數(shù)據(jù)。

2. createSeries() 函數(shù)

void DynamicChart::createSeries(int seriesId, const QString &name)
{
#ifdef LINE
    QLineSeries *series = new QLineSeries();
#else
    QSplineSeries *series = new QSplineSeries();
#endif
    series->setName(name);
    m_chart->addSeries(series);
    // 使用共用的坐標(biāo)軸
    series->attachAxis(axisX);
    series->attachAxis(axisY);
    seriesMap.insert(seriesId, series);
}

該函數(shù)負(fù)責(zé)創(chuàng)建新的系列(折線(xiàn)或樣條曲線(xiàn)),并將其添加到圖表中。 seriesId 用于標(biāo)識(shí)不同的曲線(xiàn),name 則用于顯示系列的名稱(chēng)。系列將共享同一套坐標(biāo)軸。

3. addPointAnimated() 函數(shù)

void DynamicChart::addPointAnimated(int seriesId, const QPointF &point)
{
    if (!seriesMap.contains(seriesId)) return;
#ifdef LINE
    QLineSeries *series = seriesMap[seriesId];
#else
    QSplineSeries *series =seriesMap[seriesId];
#endif
    if (!series->points().isEmpty()) {
        lastPoint = series->points().last();
    } else {
        lastPoint = point; // 第一個(gè)點(diǎn)直接添加
        series->append(point);
    }
    newPoint = point;
    currentSeriesId = seriesId;
    currentStep = 0;
    stepsCount = 10; // 分10步完成連線(xiàn)
    timer.start();
}

該函數(shù)用于為指定的系列添加新點(diǎn),并通過(guò)動(dòng)畫(huà)效果使新點(diǎn)逐步出現(xiàn)在圖表上。它會(huì)計(jì)算新點(diǎn)與最后一個(gè)點(diǎn)之間的插值,并逐步繪制曲線(xiàn)。

4. animateDrawing() 函數(shù)

void DynamicChart::animateDrawing()
{
#ifdef LINE
    QLineSeries *series = seriesMap[currentSeriesId];
#else
    QSplineSeries *series =seriesMap[currentSeriesId];
#endif
    if (currentStep >= stepsCount) {
        timer.stop();
        series->append(newPoint);
        return;
    }
    qreal x = lastPoint.x() + (newPoint.x() - lastPoint.x()) * currentStep / stepsCount;
    qreal y = lastPoint.y() + (newPoint.y() - lastPoint.y()) * currentStep / stepsCount;
    series->append(x, y);
    // 動(dòng)態(tài)更新坐標(biāo)軸
    if (x > axisX->max()) {
        axisX->setMax(x + 10);
    }
    if (y > axisY->max() || y < axisY->min()) {
        axisY->setMax(qMax(y + 10, axisY->max()));
        axisY->setMin(qMin(y - 10, axisY->min()));
    }
    currentStep++;
}

該函數(shù)實(shí)現(xiàn)了通過(guò)定時(shí)器觸發(fā)的動(dòng)態(tài)繪制。它逐步將新點(diǎn)與前一個(gè)點(diǎn)連接,并動(dòng)態(tài)調(diào)整坐標(biāo)軸的范圍以適應(yīng)新增數(shù)據(jù)。

主窗口邏輯

最后的代碼片段展示了如何使用 DynamicChart 類(lèi)創(chuàng)建一個(gè)包含多個(gè)曲線(xiàn)的圖表,并通過(guò)按鈕控制定時(shí)器的啟動(dòng)與停止:

setMinimumSize(QSize(800,500));
chartView = new DynamicChart(this);
chartView->createSeries(1, "Test Series 1");
chartView->createSeries(2, "Test Series 2");
chartView->createSeries(3, "Test Series 3");
chartView->createSeries(4, "Test Series 4");
QTimer *timer = new QTimer;
connect(timer, &QTimer::timeout, this, [=]()
{
    int m_id = QRandomGenerator::global()->bounded(1, 5);
    chartView->addPointAnimated(m_id, QPointF(m_index++, QRandomGenerator::global()->bounded(100)));
});
startButton = new QRadioButton("StartDrawing", this);
connect(startButton, &QRadioButton::clicked, [=](bool arg)
{
    if (arg)
        timer->start(100);
    else
        timer->stop();
});

通過(guò) QRadioButton 控制定時(shí)器的啟停,點(diǎn)擊按鈕后,程序?qū)㈤_(kāi)始在圖表上隨機(jī)添加點(diǎn),并動(dòng)態(tài)繪制折線(xiàn)或樣條曲線(xiàn)。

結(jié)論

此程序通過(guò)Qt的 QChartView 和定時(shí)器,實(shí)現(xiàn)了一個(gè)能夠動(dòng)態(tài)繪制多條曲線(xiàn)的折線(xiàn)圖表。通過(guò)定時(shí)器控制數(shù)據(jù)點(diǎn)的逐步繪制,并結(jié)合坐標(biāo)軸的動(dòng)態(tài)更新,使得該圖表在繪圖過(guò)程中能夠自動(dòng)適應(yīng)數(shù)據(jù)的變化。這種方式適用于需要實(shí)時(shí)顯示數(shù)據(jù)變化的場(chǎng)景,如傳感器數(shù)據(jù)的實(shí)時(shí)監(jiān)控或動(dòng)態(tài)性能分析等。

到此這篇關(guān)于使用Qt實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)動(dòng)態(tài)繪制的折線(xiàn)圖示例的文章就介紹到這了,更多相關(guān)Qt動(dòng)態(tài)折線(xiàn)圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于errno返回值的對(duì)應(yīng)錯(cuò)誤碼的詳細(xì)介紹

    基于errno返回值的對(duì)應(yīng)錯(cuò)誤碼的詳細(xì)介紹

    本篇文章是對(duì)errno返回值的對(duì)應(yīng)錯(cuò)誤碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++使用extern實(shí)現(xiàn)源文件變量與類(lèi)成員函數(shù)的巧妙共享

    C++使用extern實(shí)現(xiàn)源文件變量與類(lèi)成員函數(shù)的巧妙共享

    C++中使用extern關(guān)鍵字可實(shí)現(xiàn)在源文件之間共享變量與類(lèi)成員函數(shù),通過(guò)聲明變量或類(lèi)在頭文件中,再在一個(gè)源文件中定義,其他源文件通過(guò)extern引用,促使模塊化、可維護(hù)的代碼組織,這篇文章主要介紹了C++用extern實(shí)現(xiàn)源文件變量與類(lèi)成員函數(shù)的巧妙共享,需要的朋友可以參考下
    2024-03-03
  • C語(yǔ)言中的while循環(huán)語(yǔ)句示例詳解

    C語(yǔ)言中的while循環(huán)語(yǔ)句示例詳解

    這篇文章主要介紹了C語(yǔ)言中的while循環(huán)語(yǔ)句,主要包括while循環(huán)的基本信息及常見(jiàn)問(wèn)題,本文結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • C/C++利用篩選法算素?cái)?shù)的方法示例

    C/C++利用篩選法算素?cái)?shù)的方法示例

    這篇文章主要給大家介紹了關(guān)于利用C/C++篩選法算素?cái)?shù)的相關(guān)資料,文中給大家列舉了普通枚舉法和篩選法兩種方法實(shí)現(xiàn)的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • C++文件關(guān)鍵詞快速定位出現(xiàn)的行號(hào)實(shí)現(xiàn)高效搜索

    C++文件關(guān)鍵詞快速定位出現(xiàn)的行號(hào)實(shí)現(xiàn)高效搜索

    這篇文章主要為大家介紹了C++文件關(guān)鍵詞快速定位出現(xiàn)的行號(hào)實(shí)現(xiàn)高效搜索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 解決C++中重定義的方法總結(jié)

    解決C++中重定義的方法總結(jié)

    本篇文章是對(duì)C++中重定義的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Qt重復(fù)添加控件問(wèn)題的現(xiàn)象、原理與解決方案

    Qt重復(fù)添加控件問(wèn)題的現(xiàn)象、原理與解決方案

    本文分析了Qt開(kāi)發(fā)中重復(fù)添加控件導(dǎo)致的常見(jiàn)問(wèn)題,包括界面重疊、內(nèi)存泄漏和信號(hào)混亂,通過(guò)剖析Q時(shí)象樹(shù)管理機(jī)制,揭示了問(wèn)題根源在于父子關(guān)系管理失效,并提出了三種解決方案,需要的朋友可以參考下
    2026-01-01
  • Matlab實(shí)現(xiàn)繪制玫瑰線(xiàn)的示例代碼

    Matlab實(shí)現(xiàn)繪制玫瑰線(xiàn)的示例代碼

    這篇文章主要為大家介紹了如何利用Matlab繪制3好看的玫瑰線(xiàn),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,感興趣的小伙伴可以動(dòng)手試一試
    2022-08-08
  • C語(yǔ)言游戲之猜數(shù)字

    C語(yǔ)言游戲之猜數(shù)字

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言游戲之猜數(shù)字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++統(tǒng)計(jì)函數(shù)執(zhí)行時(shí)間的最佳實(shí)踐

    C++統(tǒng)計(jì)函數(shù)執(zhí)行時(shí)間的最佳實(shí)踐

    在軟件開(kāi)發(fā)過(guò)程中,性能分析是優(yōu)化程序的重要環(huán)節(jié),了解函數(shù)的執(zhí)行時(shí)間分布對(duì)于識(shí)別性能瓶頸至關(guān)重要,本文將分享一個(gè)C++函數(shù)執(zhí)行時(shí)間統(tǒng)計(jì)工具,希望對(duì)大家有所幫助
    2025-09-09

最新評(píng)論

深圳市| 平安县| 七台河市| 芮城县| 河北省| 合水县| 平度市| 辽源市| 亚东县| 鲁甸县| 临江市| 汝南县| 浦江县| 璧山县| 库尔勒市| 扎鲁特旗| 岳阳县| 伽师县| 运城市| 锦州市| 靖西县| 木兰县| 含山县| 杨浦区| 武城县| 新竹市| 台东市| 合江县| 永州市| 广东省| 正阳县| 乐安县| 敖汉旗| 叙永县| 长兴县| 阿拉尔市| 吕梁市| 茂名市| 桑植县| 长岭县| 蕲春县|