Qt圖形圖像開(kāi)發(fā)之高性能曲線圖模塊QCustomplot庫(kù)詳細(xì)使用方法與實(shí)例(支持動(dòng)、靜曲線圖)
Qt曲線圖模塊QCustomPlot庫(kù)介紹
QCustomPlot是一個(gè)小型的Qt畫(huà)圖標(biāo)類,支持繪制靜態(tài)曲線、動(dòng)態(tài)曲線、多重坐標(biāo)曲線,柱狀圖,蠟燭圖等
前段時(shí)間用QChart模塊畫(huà)圖,一條曲線上面放8000條數(shù)據(jù)就會(huì)卡的不行必須要換個(gè)其他的控件,后來(lái)找到了曲線圖模塊QCustomplot庫(kù)
這個(gè)庫(kù)性能非常好,畫(huà)曲線圖折線圖柱狀圖動(dòng)態(tài)靜態(tài),放大縮小,都很好用,10w條數(shù)據(jù)量無(wú)壓力秒畫(huà)出來(lái)一點(diǎn)也不卡
下載地址
https://www.qcustomplot.com/index.php/download
里面分為
QCustomPlot 2和QCustomPlot 1我用的2這兩個(gè)有一些函數(shù)的差異
下載解壓以后我們只需要qcustomplot.h和qcustomplot.cpp
注意
pro 文件里面 寫(xiě)入 QT+= printsupport
動(dòng)態(tài)效果
QCustomplot靜態(tài)曲線圖生成
//他繼承QWidget 所以構(gòu)造里面 放控件就會(huì)畫(huà)到控件上 QCustomPlot *pCustomPlot = new QCustomPlot(ui->label); //添加一條曲線 QCPGraph* pgraph = pCustomPlot->addGraph(); //給曲線準(zhǔn)備數(shù)據(jù) 設(shè)置數(shù)據(jù) QVector<double> x(80000); QVector<double> y(80000); for(int i = 0; i<x.size();i++) { x[i] = i; if(i%2==0) y[i] = 10; else y[i] = 20; } //設(shè)置數(shù)據(jù) pCustomPlot->graph(0)->setData(x,y); //設(shè)置Y軸范圍 pCustomPlot->yAxis->setRange(0,30); //x軸名字 pCustomPlot->xAxis->setLabel("X"); //Y軸名字 pCustomPlot->yAxis->setLabel("Y"); //設(shè)置大小 pCustomPlot->resize(ui->label->width(),ui->label->height()); //可以進(jìn)行鼠標(biāo)位置 放大縮小 拖拽 放大縮小坐標(biāo)系?。?!功能非常強(qiáng)大 pCustomPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); //重繪 每次改變完以后都要調(diào)用這個(gè)進(jìn)行重新繪制 pCustomPlot->replot();
運(yùn)行效果如下:
時(shí)間為坐標(biāo)軸的靜曲線圖
大致差不多 區(qū)別在于x軸改為時(shí)間
QCustomPlot* p2 = new QCustomPlot(ui->label_2); QVector<double> time; QVector<double> y; //模擬幾個(gè)時(shí)間 .toTime_t()是轉(zhuǎn)換為 時(shí)間戳 從1970年到現(xiàn)在的秒數(shù) time<<QDateTime::fromString("2019-01-15 17:08:23","yyyy-MM-dd hh:mm:ss").toTime_t(); time<<QDateTime::fromString("2019-01-25 17:08:23","yyyy-MM-dd hh:mm:ss").toTime_t(); time<<QDateTime::fromString("2019-02-15 17:08:23","yyyy-MM-dd hh:mm:ss").toTime_t(); time<<QDateTime::fromString("2019-02-25 17:08:23","yyyy-MM-dd hh:mm:ss").toTime_t(); time<<QDateTime::fromString("2019-03-27 13:08:23","yyyy-MM-dd hh:mm:ss").toTime_t(); y<<5<<15<<5<<15<<5; //增加一條線 p2->addGraph(); //設(shè)置Y軸范圍 p2->yAxis->setRange(0,20); //QCPAxisTickerDateTime 時(shí)間坐標(biāo)軸 必須要用 智能指針 QSharedPointer<QCPAxisTickerDateTime> timer(new QCPAxisTickerDateTime); //設(shè)置時(shí)間格式 timer->setDateTimeFormat("yyyy-MM-dd"); //設(shè)置時(shí)間軸 一共幾格 //timer->setTickCount(6); //設(shè)置label 旋轉(zhuǎn)30° 橫著顯示可能顯示不全 p2->xAxis->setTickLabelRotation(30); // timer->setTickStepStrategy(QCPAxisTicker::tssMeetTickCount); //設(shè)置坐標(biāo)軸 p2->xAxis->setTicker(timer); p2->xAxis->setRange(time.at(0),time.at(4)); p2->graph(0)->setData(time,y); p2->resize(ui->label_2->width(),ui->label_2->height()); p2->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
運(yùn)行效果如下:
QCustomplot動(dòng)態(tài)曲線圖生成
下圖動(dòng)態(tài)曲線是我用傳感器采集的,大家可以用一些隨機(jī)數(shù)據(jù)來(lái)測(cè)試
假設(shè)圖像只顯示10個(gè)點(diǎn) 第11個(gè)點(diǎn)將會(huì)把第一個(gè)點(diǎn)擠出去 就是一個(gè)vector 出棧入棧 里面一直保持10個(gè)數(shù)據(jù)
//QVector<double> sx_vec,xAxis_vec 存放數(shù)據(jù)的容器 //m_chartPoint_counter 計(jì)數(shù)器 一直增加 來(lái)一條數(shù)據(jù)增加一下 控制x軸前進(jìn) 實(shí)現(xiàn)動(dòng)態(tài)效果 //這時(shí)容器里面還沒(méi)10個(gè)點(diǎn) 所有一直向里面存 if(m_chartPoint_counter < 10) { sx_vec.append(sx_); xAxis_vec.append(m_chartPoint_counter); //設(shè)置范圍正好 能顯示當(dāng)前點(diǎn) sx_plot->xAxis->setRange(0,xAxis_vec.at(xAxis_vec.size()-1)); } else { //容器數(shù)據(jù)現(xiàn)在是正好10個(gè) 把第一個(gè)出棧 把第11個(gè)入棧 正好還是10個(gè)數(shù)據(jù) sx_vec.removeFirst(); xAxis_vec.removeFirst(); //入棧 xAxis_vec.append(m_chartPoint_counter); sx_vec.append(sx_); //設(shè)置范圍正好 能顯示當(dāng)前點(diǎn) sx_plot->xAxis->setRange(xAxis_vec.at(0),xAxis_vec.at( xAxis_vec.size()-1)); } //設(shè)置Y軸坐標(biāo)系 自動(dòng)縮放以正常顯示所有的數(shù)據(jù) sx_plot->yAxis->rescale(true); //設(shè)置數(shù)據(jù) sx_plot->graph()->setData(xAxis_vec,sx_vec); //重繪制 sx_plot->replot(); //這里必須要一直增加 如果增加到10就不增加 效果就是第10個(gè)點(diǎn)一直變化 不會(huì)出現(xiàn)動(dòng)態(tài)效果 m_chartPoint_counter++;
圖像數(shù)據(jù)清空
//圖像數(shù)據(jù)清空 QCPGraph* thresholdY_line; thresholdY_line->data().data()->clear();
這里只是介紹一些基本的功能 ,一些強(qiáng)大的功能 在 下載的examples里有
本文主要講解了Qt圖形圖像開(kāi)發(fā)之高性能曲線圖模塊QCustomplot庫(kù)詳細(xì)使用方法與實(shí)例,更多關(guān)于QT開(kāi)發(fā)的知識(shí)請(qǐng)查看下面的相關(guān)鏈接
相關(guān)文章
C/C++實(shí)現(xiàn)7bit與8bit編碼互相轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了如何使用C/C++實(shí)現(xiàn)7bit與8bit編碼互相轉(zhuǎn)換功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-10-10c++實(shí)現(xiàn)跳躍表(Skip List)的方法示例
跳表(skiplist)是一個(gè)非常優(yōu)秀的數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)簡(jiǎn)單,插入、刪除、查找的復(fù)雜度均為O(logN),下面這篇文章主要介紹了c++實(shí)現(xiàn)跳躍表(Skip List)的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09VC動(dòng)態(tài)生成菜單項(xiàng)的實(shí)現(xiàn)方法
這篇文章主要介紹了VC動(dòng)態(tài)生成菜單項(xiàng)的實(shí)現(xiàn)方法,在桌面應(yīng)用程序開(kāi)發(fā)中常會(huì)用到的一個(gè)功能,需要的朋友可以參考下2014-08-08C語(yǔ)言連接并操作Sedna XML數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了C語(yǔ)言連接并操作Sedna XML數(shù)據(jù)庫(kù)的方法,實(shí)例分析了C語(yǔ)言操作XML文件的相關(guān)技巧,需要的朋友可以參考下2015-06-06C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的通訊錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06Qt+QListWidget實(shí)現(xiàn)氣泡聊天界面(附源碼)
由于最近的項(xiàng)目需要,做了些相關(guān)IM的工作。所以聊天框也是必不可少的一部分。本文以QListWidget+QPainter繪制的Item做了一個(gè)Demo。該Demo只是做一個(gè)示例,感興趣的可以了解一下2022-12-12C語(yǔ)言實(shí)現(xiàn)掃雷游戲詳解(附源碼)
大家好,本篇文章主要講的是C語(yǔ)言實(shí)現(xiàn)掃雷游戲詳解(附源碼),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01