QCustomPlot 对鼠标悬停的轴进行缩放

功能

当鼠标悬停在某一个轴上时,滚动鼠标滚轮,可实现对该轴进行缩放,其他轴不变。
请添加图片描述
PRPDView 集成自 QCustomPlot

初始化

void PRPDView::creatInit()
{
    this->yAxis2->setVisible(true);//显示x轴2
    this->yAxis2->setRange(0,10);
    //    this->axisRect()->setupFullAxesBox(true);//会影响轴yAxis2显示
    this->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom |QCP::iSelectAxes);
    this->xAxis->setRange(0,360);   //相位 0~360
    
    mTemplateCurve = addGraph(this->xAxis,this->yAxis);
    mScatterCurve = addGraph(this->xAxis,this->yAxis2);

    QPen drawPen;
    drawPen.setColor(Qt::blue);
    drawPen.setWidth(2);
    mTemplateCurve->setPen(drawPen);

    drawPen.setColor(Qt::red);
    drawPen.setWidth(4);
    mScatterCurve->setPen(drawPen);
    mScatterCurve->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle));
    mScatterCurve->setLineStyle(QCPGraph::lsNone);

    this->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignTop | Qt::AlignHCenter);   // 对齐于QCPAxisRect中间的顶部

    connect(this, &PRPDView::mouseWheel, this, &PRPDView::slot_mouseWheel);
}

生成模拟数据

void PRPDView::setDemo()
{
    //生成模板图
    QVector<double> xPoints(360),yPoints(360);
    for(int x0 = 0;x0 < 361 ;x0++){
        xPoints.append(x0);
        yPoints.append(qSin((double)x0/360. * 2 * Pi) * 1000);
    }
    this->templateGraph()->setData(xPoints,yPoints);
    //生成随机散点图
    xPoints.clear();
    yPoints.clear();
    for(int cnt = 0;cnt < 5000;cnt++){
        xPoints.append(QRandomGenerator::global()->bounded(1.) * 360.);
        yPoints.append(QRandomGenerator::global()->bounded(1.) * 10.);
    }
    this->scatterGtaph()->setData(xPoints,yPoints);
    this->rescaleValueAxisinRange();
    this->replot();
}

槽函数

void PRPDView::slot_mouseWheel()
{
    QList<QCPAxis*> axes;
    if (xAxis->axisRect()->rect().contains(QCursor::pos())){
        axes<<xAxis;
        axisRect()->setRangeZoomAxes(axes);
        axisRect()->setRangeZoom(xAxis->orientation());
    }
    else if (yAxis->axisRect()->rect().contains(QCursor::pos())){
        axes<<yAxis;
        axisRect()->setRangeZoomAxes(axes);
        axisRect()->setRangeZoom(yAxis->orientation());
    }
    else if(yAxis2->axisRect()->rect().contains(QCursor::pos())){
        axes<<yAxis2;
        axisRect()->setRangeZoomAxes(axes);
        axisRect()->setRangeZoom(yAxis2->orientation());
    }
    else{
        axes<<yAxis<<xAxis<<yAxis2;
        axisRect()->setRangeZoomAxes(axes);
        axisRect()->setRangeZoom(Qt::Horizontal|Qt::Vertical);
    }
}

main

PRPDView *view = new PRPDView();
view->setAttribute(Qt::WA_DeleteOnClose);
view->setDemo();
view->show();
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Wild *p

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

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

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

打赏作者

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

抵扣说明:

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

余额充值