Qcustormplot 实现鼠标框选 放大缩小 拖拽 游标显示及吸附

基于Qcustormplot 2.1,用简单少量代码实现了曲线图标的鼠标左键框选放大,鼠标中键放大缩小按住拖拽,游标显示及曲线吸附功能。

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);
  setupPlot();

  m_Tracer = QSharedPointer<myTracer> (new myTracer(ui->plot, ui->plot->graph(1), DataTracer));
  connect(ui->plot, SIGNAL(mouseMove(QMouseEvent*)), this,SLOT(showTracer(QMouseEvent*)));

}

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

void MainWindow::setupPlot()
{
  ui->plot->addGraph();
  ui->plot->graph()->setPen(QPen(Qt::blue));
  ui->plot->graph()->setBrush(QBrush(QColor(0, 0, 255, 20)));
  ui->plot->addGraph();
  ui->plot->graph()->setPen(QPen(Qt::red));
  QVector<double> x(500), y0(500), y1(500);
  for (int i=0; i<500; ++i)
  {
    x[i] = (i/499.0-0.5)*10;
    y1[i] = qExp(-x[i]*x[i]*0.25)*5;
  }
//  ui->plot->graph(0)->setData(x, y0);
  ui->plot->graph(1)->setData(x, y1);
  ui->plot->axisRect()->setupFullAxesBox(true);
  ui->plot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);//可以进行鼠标位置 放大缩小 拖拽  放大缩小坐标系

  ui->plot->selectionRect()->setPen(QPen(Qt::black,1,Qt::DashLine));//设置选框的样式:虚线
  ui->plot->selectionRect()->setBrush(QBrush(QColor(0,0,100,20)));//设置选框的样式:半透明浅蓝
  ui->plot->setSelectionRectMode(QCP::SelectionRectMode::srmZoom);
}

void MainWindow::showTracer(QMouseEvent *event)
{
    //获取鼠标坐标
    double x = ui->plot->xAxis->pixelToCoord(event->pos().x());
    double y = ui->plot->yAxis->pixelToCoord(event->pos().y());
    //根据鼠标X坐标获取游标的Y坐标,
    QString str = QString::number(x, 'f', 1);//x轴取两位小数
    double x_val =str.toDouble();
    double y_val = ui->plot->graph(1)->data()->findBegin(x_val)->value;//吸附曲线

    if(y > ui->plot->yAxis->range().upper ||y < ui->plot->yAxis->range().lower|| x > ui->plot->xAxis->range().upper||x < ui->plot->xAxis->range().lower)
    {
        m_Tracer->setVisible(false);
    }else
    {
        m_Tracer->setVisible(true);
        m_Tracer->updatePosition(x_val, y_val);
        m_Tracer->setText(QString::number(x_val, 'f', 1),QString::number(y_val, 'f', 3));//x轴取两位小数,y轴保留三位小数
    }

    ui->plot->replot();
}

源码下载:https://download.csdn.net/download/zhuling9026/19684542

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhuling9026

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值