看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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