CustomPlot在Qt下⿏标点击曲线显⽰当前坐标
此次记录主要是为了下次使⽤时能回忆起来才做得笔记,若有需改进的地⽅,请不吝珠⽟。
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 {
15delete 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
9namespace Ui {
10class Widget;
11 }
12
13class Widget : public QWidget
14 {
15    Q_OBJECT
16
17public:
18explicit Widget(QWidget *parent = 0);
19    ~Widget();
20
21private:
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初始化坐标显⽰标签初始化
6void 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
tabletable
33//CustomPlot数据填充
34void ChartDisplay::Ploar1PrapareData()
35 {
36    QVector<double> Xvalue(100);
37    QVector<double> Yvalue(100);
38for (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//选点处理函数
47void ChartDisplay::OnPlotClick(QCPAbstractPlottable *plottable, int dataIndex, QMouseEvent *event)
48 {
49//先获取点击的绘图层名称,然后通过名称到图层ID,再到对应的数据点这⾥因为知道ID 所以直接使⽤没有通过名称
50const 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
7class ChartDisplay : public QWidget
8 {
9    Q_OBJECT
10public:
11explicit ChartDisplay(QWidget *parent = nullptr);
12    QCustomPlot *CustomPlot;
13    QCPItemText *TextTip;
14void Ploar1Init(QCustomPlot *customplot);
15void Ploar1PrapareData();
16private slots:
17void OnPlotClick(QCPAbstractPlottable *plottable, int dataIndex, QMouseEvent *event);
18 };
19
20#endif// CHARTDISPLAY_H
所有⽂件结构如图1所⽰
第⼀点:qcustomplot.h 和 qcustomplot.cpp可以直接去这⾥看;
第⼆点:下载完成后把.cpp和.h放在⼯程⽬录下,并将cpp和h加⼊⼯程;
第三点:切记要在.pro中:QT += printsupport;
第四点:在ui中添加⼀个Widget,右键提升为,如图2 输⼊:QCustomPlot后,下⾯会⾃动⽣成头⽂件,记得深蓝⾊部分⼀定要勾选哦,之后点提升即可;
第五点:最后改变对象名称为customplot就可以和上⾯的代码吻合了;
图1
图2
效果图如图3所⽰由于只是测试是否可以显⽰坐标,所以没有改进代码,显⽰后挥之不去,哈哈^_^有点⼩尴尬。不过实际做项⽬的时候会在线程加上下⾯这句代码,实际效果还没有测试。(实测中发现如果不太耐⼼的⼈点击的时候应该会疯掉的罒ω罒)
1 TextTip->setVisible(false);
图3
这只是⼀个基础代码,功能不是太多,需要后续拓展。我就不多解释代码了,注释应该已经很清楚了。
          常怀⼀颗⼼————空杯⼼

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。