陳嘉敏 趙云峰 史家樂
摘 要:在實(shí)際開發(fā)中如果我們想要快速的開發(fā)出一款簡單實(shí)用的上位機(jī)軟件,而我們又是側(cè)重底層開發(fā)或者剛?cè)腴T的新手,先前沒有進(jìn)行過相關(guān)的操作,這時(shí)Qt將是你的一個(gè)非常好的選擇。Qt采用C++進(jìn)行編程,完全向下兼容C語言,而且還有豐富的控件,這對(duì)于新手是非常容易上手的。而且Qt自帶了很多模塊,為我們的帶來了很多便利。本文我將著重就上位機(jī)開發(fā)中經(jīng)常要用到的數(shù)據(jù)處理結(jié)合我前些日子做的一個(gè)小例子給大家分享一下如何用Qt實(shí)現(xiàn)數(shù)據(jù)的接收、存儲(chǔ)和圖形化顯示。
關(guān)鍵詞:Qt;圖表;數(shù)據(jù)庫
引言
本人一直在從事的都是底層的硬件驅(qū)動(dòng),使用的都是面向過程的語言C語言。但前些日子由于業(yè)務(wù)需求需要開發(fā)一個(gè)簡單的上位軟件監(jiān)控界面,因此自學(xué)了C++和Qt,并最終完成了該監(jiān)控界面程序的開發(fā),可以實(shí)現(xiàn)常用的數(shù)據(jù)圖表化顯示,實(shí)現(xiàn)簡單的曲線圖的繪制。下面我將簡單總結(jié)一下這段時(shí)間以來本人的一些經(jīng)驗(yàn)和遇到的問題,希望能給有這方面需求的人帶來一些幫助。
一、準(zhǔn)備工作
1)在工程的pro文件中添加QT += charts,這個(gè)語句是用來導(dǎo)入圖表模塊charts,如果沒有導(dǎo)入這個(gè)模塊,圖表相關(guān)的類都不能使用。
2)在mainwindow.h中添加#include
3)在mainwindow.h中添加如下代碼:
QT_CHARTS_BEGIN_NAMESPACE
class QLineSeries;
class QChart;
QT_CHARTS_END_NAMESPACE
QT_CHARTS_USE_NAMESPACE
代碼分析:從Qt源碼定義中可以看出若把上面的代碼展開看,就是定義了一個(gè)命名空間QT_CHARTS_NAMESPACE,并把需要的兩個(gè)類添加進(jìn)這個(gè)命名空間中。
二、相關(guān)的類及具體實(shí)現(xiàn)
想要在Qt中實(shí)現(xiàn)曲線圖的繪制需要的最基本的類即為Qchart類,除此之外還需要QLineSeries、QChartView、QValueAxis等類。下面我將一一介紹各個(gè)類的作用
1)QValueAxis類
這個(gè)類的作用是用來自定義坐標(biāo)軸的。其實(shí)Qchart類里也有一個(gè)默認(rèn)的坐標(biāo)軸,但是一般都不太符合我們的要求,所以一般的做法就是使用這個(gè)類定義一個(gè)新的(坐標(biāo)軸)對(duì)象,設(shè)置相應(yīng)的參數(shù)后設(shè)置為Qchar的默認(rèn)坐標(biāo)軸。應(yīng)用代碼如下:
QValueAxis *axisX = new QValueAxis;axisX->setRange(0,10);//設(shè)置坐標(biāo)軸范圍
axisX->setLabelFormat("%g");//設(shè)置坐標(biāo)軸格axisX->setTitleText("Samples");
QValueAxis *axisY = new QValueAxis;axisY->setRange(0,100);
axisY->setTitleText("Humility");
2)QLineSeries類
這個(gè)類還有幾個(gè)相似的類,例QXYSeries類、QSplineSeries類等,這些類的都是用來平滑曲線,實(shí)現(xiàn)把點(diǎn)連接成線的目的。使用時(shí)只要把關(guān)鍵坐標(biāo)點(diǎn)添加進(jìn)則幾個(gè)點(diǎn)集中,然后再把這些點(diǎn)集設(shè)置成表格圖像要顯示的點(diǎn)集即可。要注意的是這幾個(gè)類對(duì)關(guān)鍵點(diǎn)的處理方式是不同的,QLineSeries類會(huì)把添加進(jìn)的點(diǎn)以直線方式連接,也即之后會(huì)生成折線圖,而QSplineSeries類會(huì)把關(guān)鍵點(diǎn)以平滑曲線連接,也即最后會(huì)生成一個(gè)曲線圖,在本次項(xiàng)目中我選擇的是QLineSeries類來連接關(guān)鍵點(diǎn),生成曲線圖。代碼示例如下:
QLineSeries *m_series = new QLineSeries;
QVector
points.append(QPointF(0,20));points.append(QPointF(1,23));
points.append(QPointF(2,12));points.append(QPointF(3,45));
points.append(QPointF(4,23));points.append(QPointF(5,43));
points.append(QPointF(6,3)); points.append(QPointF(7,43));
points.append(QPointF(8,89));points.append(QPointF(9,34));
points.append(QPointF(10,76));
m_series->replace(points);
代碼分析:上面的代碼先是定義了一個(gè)矢量點(diǎn)集points,然后向這個(gè)點(diǎn)集中添加了11個(gè)點(diǎn)的坐標(biāo),然后用replace函數(shù)替代m_series中的默認(rèn)坐標(biāo)點(diǎn)集。
3)QChart類設(shè)置圖表格式
QChart類是真正用來生成圖形曲線的,用這個(gè)類可以對(duì)生成的曲線圖進(jìn)行各種格式的設(shè)置,代碼如下:
QChart *m_chart = new QChart;m_chart->addSeries(m_series);//添加系列
m_chart->setAxisX(axisX,m_series);//設(shè)置橫坐標(biāo)軸
m_chart->setAxisY(axisY,m_series);//設(shè)置縱坐標(biāo)軸
m_chart->legend()->hide();//將默認(rèn)的圖例樣式隱藏
m_chart->setTitle("Chart test");//設(shè)置標(biāo)題
4)QchartView類顯示出圖表
QchartView類的作用是為了顯示的顯示出圖表,代碼設(shè)置如下:
QChartView *chartView = newQChartView(m_chart);chartView->setParent(this);
代碼分析:第一句代碼的作用是定義一個(gè)QChartView類的對(duì)象指針,同時(shí)為該指針開辟空間,并調(diào)用構(gòu)造函數(shù)用先前設(shè)置好的圖表m_chart去初始化該對(duì)象。第二句代碼的作用是把該對(duì)象指針(控件)添加進(jìn)主窗口,以能夠顯示在主窗上。
最后整體的顯示效果圖如下:
參考文獻(xiàn)
[1](美)普拉達(dá)(Prata,S.)著;姜佑譯.C Primer Plus(第6版)[M].北京:人民郵電出版社,2016:576-589
[2](美)Bruce Eckel.Thinking in C++(第一卷)[M].(美)新澤西:Prentice Hall,1998:319-454
[3]霍亞飛.Qt Creator快速入門[M].北京:北京航空航天大學(xué)出版社,2012,5:367-383
[4]霍亞飛.Qt及Qt Quick開發(fā)實(shí)戰(zhàn)精解[M].北京:北京航空航天大學(xué)出版社,2012,5:79-100