CustomPlot 在Qt下 滑鼠點選曲線 顯示當前座標

缺爺發表於2020-08-04

此次記錄主要是為了下次使用時能回憶起來才做得筆記,若有需改進的地方,請不吝珠玉。

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

 

 

 這只是一個基礎程式碼,功能不是太多,需要後續擴充。我就不多解釋程式碼了,註釋應該已經很清楚了。

          常懷一顆心————空杯心

相關文章