日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QCustomPlot实现实时动态曲线(包含手动设置XY轴显示的方法)

發(fā)布時間:2025/4/5 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QCustomPlot实现实时动态曲线(包含手动设置XY轴显示的方法) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Qt4中,可以使用QCustompPlot來繪制曲線,QCustompPlot是一個第三方工具,可以到官網(wǎng)下載:http://www.qcustomplot.com/index.php/download
這里實現(xiàn)一個實時動態(tài)曲線圖,用隨機數(shù)作為實時數(shù)據(jù),程序運行結(jié)果如下:

主機環(huán)境:fedora9,Qt4.7,Qtcreator 2.0.1
使用Qtcreator 2.0.1新建一個工程,基類模板選擇QMainWindow。將解壓得到的QCustompPlot文件夾里面的頭文件qcustomplot.h和源文件qcustomplot.cpp復(fù)制粘貼到工程文件夾下。在Qtcreator中,對著工程名右鍵,添加已有文件,將頭文件qcustomplot.h和源文件qcustomplot.cpp都添加到工程中來。
在界面上拖拽一個widget部件,然后升級成Qcustomplot,(參考:http://www.bubuko.com/infodetail-744744.html)部件名稱改為customPlot
mainwindow.h代碼如下:
?

  • #ifndef MAINWINDOW_H
  • #define MAINWINDOW_H
  • ?
  • #include?<QMainWindow>
  • #include?<QTimer>
  • #include?"qcustomplot.h"
  • ?
  • namespace Ui?{
  • ????class?MainWindow;
  • }
  • ?
  • class?MainWindow?:?public?QMainWindow
  • {
  • ????Q_OBJECT
  • ?
  • public:
  • ????explicit?MainWindow(QWidget?*parent?=?0);
  • ????~MainWindow();
  • ????//設(shè)置qcustomplot畫圖屬性,實時
  • ????void setupRealtimeDataDemo(QCustomPlot?*customPlot);
  • private?slots:
  • ????//添加實時數(shù)據(jù)槽
  • ????void realtimeDataSlot();
  • ?
  • private:
  • ????Ui::MainWindow?*ui;
  • ????//定時器,周期調(diào)用realtimeDataSlot()槽,實現(xiàn)動態(tài)數(shù)據(jù)添加到曲線
  • ????QTimer dataTimer;
  • ?
  • ?
  • };
  • ?
  • #endif?//?MAINWINDOW_H
  • mainwindow.cpp代碼如下:
    ?

  • #include?"mainwindow.h"
  • #include?"ui_mainwindow.h"
  • #include?<QVector>
  • #include?<QTimer>
  • #include?<QTime>
  • ?
  • ?
  • ?
  • MainWindow::MainWindow(QWidget?*parent)?:
  • ????QMainWindow(parent),
  • ????ui(new Ui::MainWindow)
  • {
  • ????ui->setupUi(this);
  • ?
  • ????setupRealtimeDataDemo(ui->customPlot);
  • ????ui->customPlot->replot();
  • ?
  • ????ui->checkBox_temp->setChecked(true);
  • ????ui->checkBox_hui->setChecked(true);
  • }
  • ?
  • MainWindow::~MainWindow()
  • {
  • ????delete ui;
  • }
  • ?
  • //畫圖初始化
  • void MainWindow::setupRealtimeDataDemo(QCustomPlot?*customPlot)
  • {
  • //#if?QT_VERSION?<?QT_VERSION_CHECK(4,?7,?0)
  • ??//QMessageBox::critical(this,?"",?"You're using Qt < 4.7, the realtime data demo needs functions that are available with Qt 4.7 to work properly");
  • //#endif
  • ??//demoName?=?"Real Time Data Demo";
  • ?
  • ??//?include this section?to?fully disable antialiasing?for?higher performance:
  • ??/*
  • ??customPlot->setNotAntialiasedElements(QCP::aeAll);
  • ??QFont font;
  • ??font.setStyleStrategy(QFont::NoAntialias);
  • ??customPlot->xAxis->setTickLabelFont(font);
  • ??customPlot->yAxis->setTickLabelFont(font);
  • ??customPlot->legend->setFont(font);
  • ??*/
  • ??customPlot->addGraph();?//?blue line
  • ??customPlot->graph(0)->setPen(QPen(Qt::blue));
  • ??customPlot->graph(0)->setName("temp");
  • ??//customPlot->graph(0)->setBrush(QBrush(QColor(240,?255,?200)));
  • ??//customPlot->graph(0)->setAntialiasedFill(false);
  • ??customPlot->addGraph();?//?red line
  • ??customPlot->graph(1)->setPen(QPen(Qt::red));
  • ??customPlot->graph(1)->setName("hui");
  • ??//customPlot->graph(0)->setChannelFillGraph(customPlot->graph(1));
  • ?
  • ?
  • ??customPlot->xAxis->setTickLabelType(QCPAxis::ltDateTime);
  • ??customPlot->xAxis->setDateTimeFormat("hh:mm:ss");
  • ??customPlot->xAxis->setAutoTickStep(false);
  • ??customPlot->xAxis->setTickStep(2);
  • ??customPlot->axisRect()->setupFullAxesBox();
  • ?
  • ??//?make?left?and?bottom axes transfer their ranges?to?right?and?top axes:
  • ??//connect(customPlot->xAxis,?SIGNAL(rangeChanged(QCPRange)),?customPlot->xAxis2,?SLOT(setRange(QCPRange)));
  • ??//connect(customPlot->yAxis,?SIGNAL(rangeChanged(QCPRange)),?customPlot->yAxis2,?SLOT(setRange(QCPRange)));
  • ?
  • ??//?setup a timer that repeatedly calls MainWindow::realtimeDataSlot:
  • ??connect(&dataTimer,?SIGNAL(timeout()),?this,?SLOT(realtimeDataSlot()));
  • ??dataTimer.start(0);?//?Interval 0 means?to?refresh as fast as possible
  • ??customPlot->legend->setVisible(true);
  • ?
  • ?
  • ?
  • }
  • ?
  • void MainWindow::realtimeDataSlot()
  • {
  • ????//key的單位是秒
  • ????double key?=?QDateTime::currentDateTime().toMSecsSinceEpoch()/1000.0;
  • ????qsrand(QTime::currentTime().msec()?+?QTime::currentTime().second()?*?10000);
  • ????//使用隨機數(shù)產(chǎn)生兩條曲線
  • ????double value0?=?qrand()?%?100;
  • ????double value1?=?qrand()?%?80;
  • ????if?(ui->checkBox_temp->isChecked())
  • ????????ui->customPlot->graph(0)->addData(key,?value0);//添加數(shù)據(jù)1到曲線1
  • ????if?(ui->checkBox_hui->isChecked())
  • ????????ui->customPlot->graph(1)->addData(key,?value1);//添加數(shù)據(jù)2到曲線2
  • ????//刪除8秒之前的數(shù)據(jù)。這里的8要和下面設(shè)置橫坐標寬度的8配合起來
  • ????//才能起到想要的效果,可以調(diào)整這兩個值,觀察顯示的效果。
  • ????ui->customPlot->graph(0)->removeDataBefore(key-8);
  • ????ui->customPlot->graph(1)->removeDataBefore(key-8);
  • ?
  • ? ? ??//自動設(shè)定graph(1)曲線y軸的范圍,如果不設(shè)定,有可能看不到圖像
    //也可以用ui->customPlot->yAxis->setRange(up,low)手動設(shè)定y軸范圍

  • ????ui->customPlot->graph(0)->rescaleValueAxis();
  • ????ui->customPlot->graph(1)->rescaleValueAxis(true); ??
  • ?
  • ????//這里的8,是指橫坐標時間寬度為8秒,如果想要橫坐標顯示更多的時間
  • ????//就把8調(diào)整為比較大到值,比如要顯示60秒,那就改成60。
  • ????//這時removeDataBefore(key-8)中的8也要改成60,否則曲線顯示不完整。
  • ????ui->customPlot->xAxis->setRange(key+0.25,?8,?Qt::AlignRight);//設(shè)定x軸的范圍
  • ????ui->customPlot->replot();
  • }
  • 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的QCustomPlot实现实时动态曲线(包含手动设置XY轴显示的方法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。