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