Qt工作笔记-使用QCustomplot实现鼠标拖动数据点画曲线

运行截图如下:


逻辑很简单,下面直接上代码。


widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include "qcustomplot.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

public slots:
    void myMousePressEvent(QMouseEvent *event);
    void myMouseReleaseEvent(QMouseEvent *event);
    void myMouseMoveEvent(QMouseEvent *event);


private:
    Ui::Widget *ui;
    QString m_myName;
    QVector<double> x,y;
    int m_point;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QDebug>
#include <math.h>
#include <QTime>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    x(100),
    y(100),
    m_point(-1),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_myName="我的折线图";
    for(int i=0;i<100;i++){
        x[i]=i;
        y[i]=1;
    }

    this->setWindowTitle("CSDN IT1995");


    ui->plot->addGraph();
    ui->plot->graph()->setData(x,y);
    ui->plot->graph()->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, QPen(Qt::black, 1.5), QBrush(Qt::white), 9));
    ui->plot->setInteractions(QCP::iRangeDrag|QCP::iRangeZoom);
    connect(ui->plot,SIGNAL(mousePress(QMouseEvent*)),this,SLOT(myMousePressEvent(QMouseEvent*)));
    connect(ui->plot,SIGNAL(mouseRelease(QMouseEvent*)),this,SLOT(myMouseReleaseEvent(QMouseEvent*)));
    connect(ui->plot,SIGNAL(mouseMove(QMouseEvent*)),this,SLOT(myMouseMoveEvent(QMouseEvent*)));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::myMousePressEvent(QMouseEvent *event)
{
    qDebug()<<"mousePressEvent";

    int x_pos = event->pos().x();
    int y_pos = event->pos().y();

    float x_val = ui->plot->xAxis->pixelToCoord(x_pos);
    float y_val = ui->plot->yAxis->pixelToCoord(y_pos);

    for(int i=0;i<100;i++){
        if(fabs(x_val-x.at(i))<0.3&&fabs(y_val-y.at(i))<0.3){
            qDebug()<<"现在选择的是第"<<i<<"个点";
            m_point=i;
            break;
        }
    }


}

void Widget::myMouseReleaseEvent(QMouseEvent *event)
{
    ui->plot->setInteractions(QCP::iRangeDrag|QCP::iRangeZoom);
    m_point=-1;
}

void Widget::myMouseMoveEvent(QMouseEvent *event)
{
    if(m_point==-1)
        return;

    ui->plot->setInteractions(QCP::iRangeZoom);

    int x_pos = event->pos().x();
    int y_pos = event->pos().y();

    float x_val = ui->plot->xAxis->pixelToCoord(x_pos);
    float y_val = ui->plot->yAxis->pixelToCoord(y_pos);

    x[m_point]=x_val;
    y[m_point]=y_val;

    ui->plot->graph()->setData(x, y);
    ui->plot->replot();

}



main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页