生活随笔
收集整理的這篇文章主要介紹了
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)容還不錯,歡迎將生活随笔推薦給好友。