此次記錄主要是為了下次使用時能回憶起來才做得筆記,若有需改進的地方,請不吝珠玉。
widget.cpp
1 #include "widget.h" 2 #include "ui_widget.h" 3 4 Widget::Widget(QWidget *parent) : 5 QWidget(parent),Chartdisplay(new ChartDisplay), 6 ui(new Ui::Widget) 7 { 8 ui->setupUi(this); 9 Chartdisplay->Ploar1Init(ui->customplot);//CustomPlot初始化 10 Chartdisplay->Ploar1PrapareData();//資料填充 11 } 12 13 Widget::~Widget() 14 { 15 delete ui; 16 }
widget.h
1 #ifndef WIDGET_H 2 #define WIDGET_H 3 4 #include <QWidget> 5 #include <QGroupBox> 6 #include <QGridLayout> 7 #include "chartdisplay.h" 8 9 namespace Ui { 10 class Widget; 11 } 12 13 class Widget : public QWidget 14 { 15 Q_OBJECT 16 17 public: 18 explicit Widget(QWidget *parent = 0); 19 ~Widget(); 20 21 private: 22 Ui::Widget *ui; 23 ChartDisplay *Chartdisplay; 24 25 }; 26 27 #endif // WIDGET_H
chartdisplay.cpp
1 #include "chartdisplay.h" 2 3 ChartDisplay::ChartDisplay(QWidget *parent) : QWidget(parent){} 4 5 //CustomPlot初始化 座標顯示標籤初始化 6 void ChartDisplay::Ploar1Init(QCustomPlot *customplot) 7 { 8 //初始化座標系範圍和意義 9 CustomPlot = customplot; 10 CustomPlot->addGraph(); 11 CustomPlot->setSelectionTolerance(1); 12 CustomPlot->graph(0)->setPen(QPen(Qt::darkGray,3,Qt::SolidLine)); 13 CustomPlot->graph(0)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssNone,1));//曲線樣式 樣式大小 14 CustomPlot->xAxis->setLabel("X"); 15 CustomPlot->yAxis->setLabel("Y"); 16 CustomPlot->xAxis->setRange(0,100); 17 CustomPlot->yAxis->setRange(-100,100); 18 CustomPlot->rescaleAxes(true);//開啟自適應 19 CustomPlot->setInteractions( QCP::iSelectPlottables | QCP::iRangeDrag |QCP::iRangeZoom );//先設定customplot的plottable繪圖層可選 滑鼠拖拽 滾輪縮放 20 21 TextTip = new QCPItemText(CustomPlot); 22 TextTip->setPositionAlignment(Qt::AlignTop|Qt::AlignHCenter); 23 TextTip->position->setType(QCPItemPosition::ptAbsolute); 24 QFont font; 25 font.setPixelSize(15); 26 TextTip->setFont(font); // make font a bit larger 27 TextTip->setPen(QPen(Qt::black)); // show black border around text 28 TextTip->setBrush(Qt::white); 29 TextTip->setVisible(false); 30 connect(CustomPlot, SIGNAL(plottableClick(QCPAbstractPlottable*, int, QMouseEvent*)), this, SLOT(OnPlotClick(QCPAbstractPlottable*, int, QMouseEvent*)));//關聯選點訊號 31 } 32 33 //CustomPlot資料填充 34 void ChartDisplay::Ploar1PrapareData() 35 { 36 QVector<double> Xvalue(100); 37 QVector<double> Yvalue(100); 38 for (int i = 0; i < 100; i++) { 39 Xvalue[i]=i; 40 Yvalue[i]=100*qSin(i * 10.0f / 100); 41 } 42 CustomPlot->graph(0)->setData(Xvalue,Yvalue); 43 CustomPlot->replot();//重繪圖形 44 } 45 46 //選點處理函式 47 void ChartDisplay::OnPlotClick(QCPAbstractPlottable *plottable, int dataIndex, QMouseEvent *event) 48 { 49 //先獲取點選的繪圖層名稱,然後通過名稱找到圖層ID,再找到對應的資料點 這裡因為知道ID 所以直接使用 沒有通過名稱找 50 const QCPGraphData *ghd = CustomPlot->graph(0)->data()->at(dataIndex); 51 QString text = "(" + QString::number(ghd->key,10,0) + "," + QString::number(ghd->value,10,0) + ")"; 52 TextTip->setText(text);//文字內容填充 53 TextTip->position->setCoords(event->pos().x()+30, event->pos().y()-15);//文字框所在位置 54 TextTip->setVisible(true); 55 CustomPlot->replot(); 56 }
chartdisplay.h
1 #ifndef CHARTDISPLAY_H 2 #define CHARTDISPLAY_H 3 #include <QWidget> 4 #include "qcustomplot.h" 5 6 7 class ChartDisplay : public QWidget 8 { 9 Q_OBJECT 10 public: 11 explicit ChartDisplay(QWidget *parent = nullptr); 12 QCustomPlot *CustomPlot; 13 QCPItemText *TextTip; 14 void Ploar1Init(QCustomPlot *customplot); 15 void Ploar1PrapareData(); 16 private slots: 17 void OnPlotClick(QCPAbstractPlottable *plottable, int dataIndex, QMouseEvent *event); 18 }; 19 20 #endif // CHARTDISPLAY_H
所有檔案結構如圖1所示
第一點:qcustomplot.h 和 qcustomplot.cpp可以直接去這裡 http://www.qcustomplot.com/找找看;
第二點:下載完成後把.cpp和.h放在工程目錄下,並將cpp和h加入工程;
第三點:切記要在.pro中:QT += printsupport;
第四點:在ui中新增一個Widget,右鍵提升為,如圖2 輸入:QCustomPlot後,下面會自動生成標頭檔案,記得深藍色部分一定要勾選哦,之後點提升即可;
第五點:最後改變物件名稱為customplot就可以和上面的程式碼吻合了;
圖1
圖2
效果圖如圖3所示 由於只是測試是否可以顯示座標,所以沒有改進程式碼, 顯示後揮之不去,哈哈^_^有點小尷尬。不過實際做專案的時候會線上程加上下面這句程式碼,實際效果還沒有測試。(實測中發現如果不太耐心的人點選的時候應該會瘋掉的罒ω罒)
1 TextTip->setVisible(false);
圖3
這只是一個基礎程式碼,功能不是太多,需要後續擴充。我就不多解釋程式碼了,註釋應該已經很清楚了。
常懷一顆心————空杯心