前言
QWT開發筆記系列整理集合,這是目前使用最爲廣泛的Qt圖表類(Qt的QWidget代碼方向只有QtCharts,Qwt,QCustomPlot),使用多年,系統性的整理,本系列旨在系統解說並逐步更新其各種Demo示例。
本文章介紹的版本爲Qwt6.2.0,該版本爲2021年7月左右發佈的。
(本篇不再整理了)
《Qt開發筆記之Qwt(一):Qwt介紹、編譯與Demo》
《Qt開發筆記之Qwt(二):Qwt儀表盤的基本使用》
Qwt庫包含GUI組件和實用程序類,它們主要用於具有技術背景的程序。除了2D繪圖框架外,它還提供了刻度、滑塊、刻度盤、圓規、溫度計、輪子和旋鈕,以控制或顯示值、數組或雙精度範圍。
Qwt 6.2可能適用於您找到Qt的所有環境。它與Qt 4.8和所有Qt5版本兼容。
Qt平臺所有>=Qt 4.8的版本都將在6.x分支中得到主動支持。
sourceforge下載地址:https://sourceforge.net/projects/qwt/files
csdn粉絲0積分下載地址:https://download.csdn.net/download/qq21497936/87231942
壓縮包包含了:
- qwt-6.2.0.zip
帶有Qwt源碼的Zip文件和Windows的html文檔 - qwt-6.2.0標準bz2
壓縮的tar文件,帶有Qwt源代碼和UNIX系統(Linux、Mac…)的html文檔 - qwt-6.2.0.pdf
Qwt文檔爲PDF文檔。 - qwt-6.2.0.qch
Qwt文檔作爲Qt壓縮幫助文檔,可以加載到Qt助手或創建者中。在Qt Creator中,上下文相關的幫助將像Qt類一樣可用。
這裏我們跟常規方式不一樣,常規方式是先編譯然後加入到項目中,我們是直接源碼帶入到源碼中編譯,第一次編譯時間會較長,但是後續不暴露qwt的動態庫,更重要的時候,當我們靈活切換平臺的時候,不需在編譯庫和引入庫上額外花費時間,以達到模塊化添加的終極目的—包含模塊.pri文件即可。
查看qwt.pro文件:
所以,包含源碼src工程即可,然後查看src.下:
所以包含src.pri即可。
最終qwt6.2.20.pri模塊內容如下:
這時候引入不進去:
需要多做兩步驟,如下圖:
把所文件前面加上$$PWD(修改之前,請copy一份備份),還得包含pro編譯時的三個配置文件,如下圖:
最終帶qwt6.2.0源碼模塊如下:
然後qmake,編譯(主要檢測一下是否移植到工程當作模塊化源碼成功):
使用-j8不到3分鐘就編完了,後續開發中因爲此模塊作爲源碼模塊包含,在非clean模式下,只需要編譯一次,但是避免了不同環境移植工程出現的各種環境問題,讓團隊成員之間交互,已經模塊包含組裝最簡單化,從而提升溝通效率和開發效率。
這裏我們做一個只是調用圖的簡單使用,用來確認該模塊可以被調用,能正常工作,搭建基礎模板demo。
void TestWidget::initQwt()
{
_pQwtPlot = new QwtPlot(this);
// 設置背景色
_pQwtPlot->setCanvasBackground(QBrush(QColor(255, 255, 255)));
// 設置x1座標軸
{
_pQwtPlot->setAxisTitle(QwtPlot::xBottom, "時間(s)");
}
// 設置y1座標軸
{
_pQwtPlot->setAxisTitle(QwtPlot::yLeft, "採集數值");
}
// 設置繪圖區域網格
{
QwtPlotGrid *pGrid = new QwtPlotGrid();
pGrid->setMajorPen(Qt::gray, 1, Qt::SolidLine);
pGrid->attach(_pQwtPlot);
}
// 設置圖例
{
QwtLegend *pLegend = new QwtLegend();
pLegend->setDefaultItemMode(QwtLegendData::Checkable);
_pQwtPlot->insertLegend(pLegend, QwtPlot::TopLegend);
}
// 設置曲線0
{
QwtPlotCurve *pCurve = new QwtPlotCurve();
pCurve->setTitle("電壓(mV)");
pCurve->setPen(Qt::blue, 2);
pCurve->setRenderHint(QwtPlotItem::RenderAntialiased, true);
// 曲線0符號對象
{
QwtSymbol *pSymbol = new QwtSymbol(QwtSymbol::Ellipse);
pSymbol->setPen(Qt::red);
pSymbol->setSize(4);
}
// 曲線0數據
{
QVector<double> vectorX;
QVector<double> vectorY;
vectorX.append(0); vectorY.append(0);
vectorX.append(1); vectorY.append(2);
vectorX.append(2); vectorY.append(3);
vectorX.append(4); vectorY.append(4);
pCurve->setSamples(vectorX, vectorY);
// 將曲線添加到繪圖
pCurve->attach(_pQwtPlot);
}
}
}
由於使用了QT_NO_KEYWORDS宏定義,因此emit、signals、slots都不用使用了,如果想使用信號槽機制的話,必須用宏來代替,分別是Q_EMIT、Q_SIGNALS、Q_SLOTS。
直接去掉,不然我們之前的模塊將需要大面積更改。
修改後,沒發現出現問題,也就這樣解決了。