利用Qt繪圖實(shí)現(xiàn)QWT繪制科學(xué)圖表
Qwt是一個基于LGPL版權(quán)協(xié)議的開源項(xiàng)目,其目標(biāo)是提供一組2D的窗體庫顯示技術(shù)領(lǐng)域的數(shù)據(jù),數(shù)據(jù)源以浮點(diǎn)數(shù)組或范圍的方式提供,輸出方式可以是Curves(曲線),Slider(滾動條), Dials(圓盤),compasses(儀表盤)等等。該工具庫基于Qt開發(fā),所以也繼承了Qt的跨平臺特性,據(jù)原作者文檔所說,該項(xiàng)目在Qt-win/Qt-x11/Qt-embedded(qvfb環(huán)境上都測試過, 運(yùn)行正常。項(xiàng)目的主頁在:http://qwt.sourceforge.net/
在網(wǎng)上搜了一下,發(fā)現(xiàn)關(guān)于qwt的中文資料實(shí)在很少,基本上只有關(guān)于編譯和安裝的文章。實(shí)際上經(jīng)過筆者實(shí)踐,Qwt的編譯和運(yùn)行實(shí)在乏善可陳,qmake;make就可以搞定,沒什么可memo的東西,所以這篇文章將以掃盲為主,介紹Qwt的feature。
當(dāng)然按照正常的順序,我們還是從編譯安裝開始。從svn服務(wù)器上下載***代碼:svn co https://qwt.svn.sourceforge.net/svnroot/qwt/trunk/qwt
進(jìn)入qwt目錄, 運(yùn)行你電腦上qt4對應(yīng)的qmake, 再運(yùn)行make編譯。如筆者環(huán)境中是
- cd qwt
- export PATH=/usr/local/Trolltech/Qt-4.5.1/bin/:$PATH
- qmake
- make
編譯要花個幾分鐘的時間。 成功后在lib下會生成 libqwt.so*文件, 并且examples也參與編譯, 生成的binary在examples/bin下, 我們可以運(yùn)行這些例子初步查看qwt的功能。
- export LD_LIBRARY_PATH=$PWD/lib
- cd examples/bin
- ./simple
simple是qwt自帶的例子中最簡單的一個, 一共只有一百來行的代碼, 實(shí)現(xiàn)了數(shù)學(xué)中的正弦函數(shù)(sin())和余弦函數(shù)(cos())曲線。如圖:
這個例子里用到的核心類有四個(以下內(nèi)容是筆者的理解, 有可能有不對的地方,請酌情閱讀):
QwtPlot
類似一個2D繪圖的容器, 里面可以放其他的QwtPlotItem派生類對象, 比如本例子中使用的QwtPlotMarker等。(有點(diǎn)類似Qt里的graphicsview的感覺。) 這個類負(fù)責(zé)控制繪圖數(shù)據(jù)的產(chǎn)生和傳遞, 并且繪制一個坐標(biāo)軸。
QwtPlotMarker
標(biāo)尺類, 用于繪制刻度線。
QwtPlotCurve
曲線類, 用于繪制各種曲線。
QwtSyntheticPointData
比較奇怪,這是個undocumented的類,估計(jì)不小心被作者遺漏了,文檔中沒有提供該類的說明,只能從源碼中尋找答案了,這一點(diǎn)很讓人郁悶。通過看code當(dāng)中的注釋和例子代碼,筆者的理解是該類負(fù)責(zé)產(chǎn)生數(shù)據(jù),它的作用是提供固定數(shù)量的浮點(diǎn)數(shù)的點(diǎn),點(diǎn)的數(shù)量在構(gòu)造類時傳入。獲取數(shù)據(jù)時QwtPlotCurve類會調(diào)用該類的y()方法獲取縱坐標(biāo)。
程序的基本流程是:
1、初始化繪圖容器, 設(shè)置坐標(biāo)軸的參數(shù)
- // Set axes
- setAxisTitle(xBottom, “x –>”);
- setAxisScale(xBottom, 0.0, 10.0);//橫坐標(biāo)從0到10, xBottom表示橫坐標(biāo)的方向從下往上
- setAxisTitle(yLeft, “y –>”);
- setAxisScale(yLeft, -1.0, 1.0); //縱坐標(biāo)-1到1,yLeft表示縱坐標(biāo)的方向從左到右
2、添加正弦余弦曲線
- // Insert new curves
- QwtPlotCurve *cSin = new QwtPlotCurve(”y = sin(x)”);
- #if QT_VERSION >= 0×040000
- cSin->setRenderHint(QwtPlotItem::RenderAntialiased);
- #endif
- cSin->setPen(QPen(Qt::red));//紅色曲線
- cSin->attach(this);
- QwtPlotCurve *cCos = new QwtPlotCurve(”y = cos(x)”);
- #if QT_VERSION >= 0×040000
- cCos->setRenderHint(QwtPlotItem::RenderAntialiased);
- #endif
- cCos->setPen(QPen(Qt::blue));//藍(lán)色曲線
- cCos->attach(this);
#p#
3、設(shè)置曲線的數(shù)據(jù)內(nèi)容
- // Create sin and cos data
- cSin->setData(FunctionData(::sin));
- cCos->setData(FunctionData(::cos));
4、添加橫縱標(biāo)尺線作為坐標(biāo)的參照
- // Insert markers
- // …a horizontal line at y = 0…
- QwtPlotMarker *mY = new QwtPlotMarker();
- mY->setLabel(QString::fromLatin1(”y = 0″));
- mY->setLabelAlignment(Qt::AlignRight|Qt::AlignTop);
- mY->setLineStyle(QwtPlotMarker::HLine);//線的方向
- mY->setYValue(0.0);//標(biāo)尺線畫在y=0的位置
- mY->attach(this);
- // …a vertical line at x = 2 * pi
- QwtPlotMarker *mX = new QwtPlotMarker();
- mX->setLabel(QString::fromLatin1(”x = 2 pi”));
- mX->setLabelAlignment(Qt::AlignLeft | Qt::AlignBottom);
- mX->setLabelOrientation(Qt::Vertical);
- mX->setLineStyle(QwtPlotMarker::VLine);
- mX->setLinePen(QPen(Qt::black, 0, Qt::DashDotLine));
- mX->setXValue(2.0 * M_PI);//該標(biāo)線畫在x=2PI的位置
- mX->attach(this);
同樣的功能如果用Qt來寫的話需要寫大量的繪圖代碼, 比較麻煩, 但使用Qwt的封裝庫代碼更OO且更容易理解和維護(hù)。 在這個例子中使用Qwt的優(yōu)勢體現(xiàn)得可能還不太明顯, 相比而言復(fù)雜一些的圖表更能體現(xiàn)Qwt的優(yōu)越性。 再來幾個例子的截圖:
小結(jié):通過這幾張圖片,可以看出,其實(shí)用Qt繪圖還是蠻不錯的。本篇的內(nèi)容希望對你有幫助哦!
【編輯推薦】