最近一個用Qt開發的項目需要繪制坐標曲線,我在老師的指點下使用了QCustomPlot這個插件,使用方法簡單,功能還算不錯。
可是在網上找了很多資料和博文都只是將官方提供的例子演示一遍,沒有系統全面的學習資料,所以我決定把自己在探索過程中獲得的一些開發實例和經驗分享出來,與大家共同學習交流,請各位朋友多多指教。
一、QCustomPlot的安裝
官方下載地址:http://www.qcustomplot.com/index.php/download
推薦下載第一個鏈接,裡面有很多官方給的例子可以參考。
下載之後將文件解壓到任意一個文件夾中,不要有中文路徑。
打開QT,新建一個窗體工程
將解壓得到的文件夾裡面的頭文件qcustomplot.h和源文件qcustomplot.cpp復制粘貼到工程文件夾下。
在Qt中,對著工程名右鍵,添加已有文件,將頭文件qcustomplot.h和源文件qcustomplot.cpp都添加到工程中來。
二、第一個例子
首先解釋一下原理:
我們可以理解為QCustomPlot就是一個繪圖板的類,它繼承於Widget,界面中的Widget類提升為QCustomPlot才能夠繪圖。
QCustomPlot中的每一個曲線是一個Graph對象,凡是跟顯示數據有關的我們就對Graph進行操作或調用Graph對象提供的方法。
一個QCustomPlot裡有四個坐標軸,其中xAxis和yAxis就是我們上圖看到的x和y坐標軸,還有兩個坐標軸xAxis1和yAxis1為上方和右方的x、y坐標,默認隱藏,可以通過程序設計顯示。
具體繪圖執行步驟:
首先我們將上面提升為QCustomPlot類的容器界面的對象重命名為qCustomPlot。
此時,我們只需要在主類Widget構造函數中加入如下代碼,即可繪制一個標准標准的y=x^3的曲線,代碼含義代碼中有注釋。
1 Widget::Widget(QWidget *parent) : 2 QWidget(parent), 3 ui(new Ui::Widget) 4 { 5 ui->setupUi(this); 6 7 //定義兩個可變數組存放繪圖的坐標數據 8 QVector<double> x(101),y(101);//分別存放x和y坐標的數據,101為數據長度 9 //添加數據,我們這裡演示y=x^3,為了正負對稱,我們x從-10到+10 10 for(int i=0;i<101;i++) 11 { 12 x[i] = i/5 - 10; 13 y[i] = x[i] * x[i] * x[i]; 14 } 15 16 //向繪圖區域QCustomPlot(從widget提升來的)添加一條曲線 17 ui->qCustomPlot->addGraph(); 18 //添加數據 19 ui->qCustomPlot->graph(0)->setData(x,y); 20 21 //設置坐標軸標簽名稱 22 ui->qCustomPlot->xAxis->setLabel("x"); 23 ui->qCustomPlot->yAxis->setLabel("y"); 24 25 //設置坐標軸顯示范圍,否則我們只能看到默認的范圍 26 ui->qCustomPlot->xAxis->setRange(-11,11); 27 ui->qCustomPlot->yAxis->setRange(-1100,1100); 28 29 //重繪,這裡可以不用,官方例子有,執行setData函數後自動重繪 30 //我認為應該用於動態顯示或者是改變坐標軸范圍之後的動態顯示,我們以後探索 31 //ui->qCustomPlot->replot(); 32 33 }
這樣我們就簡單的繪制好一個3次方的曲線了
INCLUDE目錄設置不對。
添加你自己的環境中的INCLUDE目錄
Ticker(QWidget *parent = 0);//為什麼在括號內要有(QWidget *parent = 0)?
這是構造函數的參數。C++可以使用默認參數。其實寫成iQWidget *parent = NULL;就是沒有父窗口,就更容易理解了。
void paintEvent(QPaintEvent *event);//(QPaintEvent *event)又是什麼意思?定義了event一個指針?如果說定義一個event指針那為什麼下面三句又定義了event指針?
你這麼問,應該是基礎不好,C/C++的參數名是任意的,只要符合語法要求就可以,因此是可以相同的,這個只是函數的參數,而不是定義變量。三個event指針,是三個不同類型的事件指針,是三個函數的參數,不是定義變量。
Ticker::Ticker(QWidget *parent) : QWidget(parent)//前一個ticker指的是類,第二個ticker是成員函數還是?,那後面的兩個括號內指的是什麼?
第二個是構造函數,Ticker(QWidget *parent)是構造函數,QWidget *parent是構造函數的參數;
: QWidget(parent)是初始化列表的格式,你可以搜索一下 初始化列表 來查一下更具體的內容。
void Ticker::showEvent(QShowEvent * /* event */)//定義類和成員函數?括號內又是干什麼的?是否可以將QShowEvent *換成QShowEvent * event ?
可以,函數定義的時候,是可以寫參數,也可以不寫,只簡寫參數的類型。
QWidget::timerEvent(event);//調用類和成員函數?括號內event怎麼又沒有*號了?
感覺你的基礎真的不好,函數定義的時候,參數是要寫類型的,所以那個*是表示指針類型。
而函數調用的時候,參數是指針類型的,就可以直接使用啊。如果不是指針,就用取地址符號(&)轉成地址(指針就是地址)。
void paintEvent(QPaintEvent *event);//這樣是定義,其實這麼寫更好一些
void paintEvent( QPaintEvent * event);//這個函數的參數是event,event的類型是QPaintEvent * 。感覺你的理解是這個函數的參數時 * event,而參數類型是QPaintEvent ,那樣就錯了。不知道你明白沒有。
給你一些建議,因為你的基礎看起來不是很好,建議看看譚浩強的《C++程序設計》等你完全理解這些問題了,再看看錢能的《C++程序設計》。再看國外的經典書。基礎很重要,很重要。