作者uranusjr (←這人是超級笨蛋)
看板C_and_CPP
標題Re: [問題] 請問QWT網路資源
時間Fri Jul 20 21:31:21 2012
※ 引述《jjooeeyy (陳阿燒)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: QT
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: QWT
: 問題(Question):
: 小弟想用QWT做出曲線圖圓餅圖等UI
: 雖然看了Example資料夾內很多個範例
: 但還是不太懂使用方式
: 不知道有沒有建議的網路資源可以參考使用
: 或是有比較簡單的API可以使用
: 謝謝
如果要用 Qt 的話, Qwt 應該已經是最簡單的了...
而且其實它也沒有很難啦, 只是真的文件很少, 而且 lib 本身的功能也有點雜
我用畫曲線圖舉個簡單例子, 其他的大體上沒有差很多
有方向之後舉一反三應該不難
Qwt 的 2D 圖是畫在 QwtPlot 上
http://qwt.sourceforge.net/class_qwt_plot.html#_details
這個 class 會提供 2D 圖必要的所有元件
接著我們要來畫曲線, 用 QwtPlotCurve
http://qwt.sourceforge.net/class_qwt_plot_curve.html#_details
首先, 設定你要畫哪些點
這有很多種方式:
a) 直接給兩個 arrays of doubles
這兩個 arrays 分別代表資料的 x 和 y 值
假設你有三組資料 (0.0, 0.0) (2.0, 5.5) (7.2, 3.3)
那麼就
QwtPlotCurve *curve = new QwtPlotCurve("curve name");
// 曲線的名稱會被用在 legend 上
double xs[3] = {0.0, 2.0, 7.2};
double ys[3] = {0.0, 5.5, 3.3};
curve->setSamples(xs, ys, 3);
注意 setSamples 會深拷貝(deep copy)xs 和 ys 的內容
所以 xs 和 ys 並不需要維護
此方法有一種變型 setRawSamples
這個 method「不會」進行內容拷貝, 所以你要自己維護資料 arrays
不過帶來的好處是方便於修改資料數值, 而且繪圖效率比較好
比較適合會快速變動的圖
b) 給兩個 QVector<double> &
基本上跟第一個一樣, 只是換成 container class
QVector<double> xs, ys;
xs << 0.0 << 2.0 << 7.2;
ys << 0.0 << 5.5 << 3.3;
curve->setSamples(xs, ys);
c) 給一個 QVector<QPointF> &
其實也差不多啦...
QVector<QPointF> ps;
ps << QPointF(0.0, 0.0) << QPointF(2.0, 5.5) << QPointF(7.2, 3.3);
curve->setSamples(ps);
d) 給一個 QwtSeriesData<QPointF> *
QwtSeriesData 是 Qwt 提供的 abstract serial data set class
http://qwt.sourceforge.net/class_qwt_series_data.html#_details
可以根據你的需求選擇合適的子類別
用這些 class 會比用 QVector 的效能要好
使用方法是繼承你想要的 class, 然後 override 供值 methods
這個要看相關的 class description 會比較清楚, 不然太多了講不完
例如這裡有個簡單的 QwtSyntheticPointData 用法
http://qwt.sourceforge.net/class_qwt_synthetic_point_data.html#_details
有了線之後, 就要把它顯示在圖上
QwtPlot *plot = new QwtPlot("Some Plot"); // 圖的名稱會被用在標題上
curve->attach(plot); // 把 curve 附加到 plot
plot->replot(); // 要求 plot 重繪
就這樣而已, 畫完了
Qwt engine 會自動幫你挑選一些預設的 scaling 啊顏色啊粗細之類的
如果不中意的話可以自己用 QwtPlot 的一些設定來自己調
順便解釋一個 Qwt 怎麼指定 X, Y 軸
我用這個設定是否要自動調整 axis 自動 scaling 的 method 來舉例
void QwtPlot::setAxisAutoScale(int axisId, bool on = true)
第二個參數很簡單, 給 false 就是要求 Qwt engine 不要自動調
(也就代表你通常要自己用 setAxitScale 來手動給)
第一個比較重要, 這是代表你要設定哪一個軸
QwtPlot 提供最多四個軸, X 和 Y 各兩個(參考 QwtPlot::Axis 這個 enum)
其中預設會顯示 yLeft 和 xBottom
如果想要顯示其他的軸, 則要呼叫 enableAxis(int axisId)
這就衍生出一個問題
如果(舉例而言)有兩個 Y 軸, 畫圖的時候 Qwt engine 怎麼知道要用哪個?
答案是 QwtPlotCurve 有一個 method 叫 setYAxis(int axisId)
當然也有對應的 X 軸版本啦
最簡單的用法大概就這樣
當然另外還有很多東西可以搞, 不過太多了要一時講完不實際
有問題再討論吧
--
"問おう、貴方が私のマスターか?"
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 1.164.138.155
推 ables:推推 07/20 21:38
推 jjooeeyy:謝謝 我研究看看 如果有問題再請教您 07/22 01:49
推 EdisonX:u 大真是多才多藝, 推一個. 07/22 01:54