QChart实现局部放大缩小、鼠标按下平移

放大、缩小、平移,其实就是通过修改横、纵坐标轴的范围实现。
前2个函数实现平移,第3个函数实现放大、缩小。

// ChartView继承自QChartView,并重写相关函数
// class ChartView : public QtCharts::QChartView
void ChartView::mousePressEvent(QMouseEvent *event)
{
    // 鼠标按下时记录当前按下的坐标
    if(event->button() == Qt::LeftButton)
    {
        QPoint p = event->pos();
        lastXY = chart()->mapToValue(p);
    }
}
void ChartView::mouseMoveEvent(QMouseEvent *event)
{
    QPoint mousePoint = event->pos();
    QPointF chartPoint = chart()->mapToValue(mousePoint);
    if(event->buttons() & Qt::LeftButton){
        float xOffset=chartPoint.x()-lastXY.x();
        float yOffset=chartPoint.y()-lastXY.y();
		// 获取坐标轴
        QValueAxis *_axisX = qobject_cast<QValueAxis *>(chart()->axes(Qt::Horizontal)[0]);
        QValueAxis *_axisY = qobject_cast<QValueAxis *>(chart()->axes(Qt::Vertical)[0]);

        _axisX->setRange(_axisX->min()-xOffset, _axisX->max()-xOffset);
        _axisY->setRange(_axisY->min()-yOffset, _axisY->max()-yOffset);
    }
	// 调用父类的 mouseMoveEvent 处理其他事件
    QChartView::mouseMoveEvent(event);
}
void ChartView::wheelEvent(QWheelEvent *event)
{
    int delta = event->angleDelta().y();
    if (delta > 0)
    {
        QPointF mousePoint = event->position();
        QPointF chartPoint = chart()->mapToValue(mousePoint);

        QValueAxis *_axisX = qobject_cast<QValueAxis *>(chart()->axes(Qt::Horizontal)[0]);
        QValueAxis *_axisY = qobject_cast<QValueAxis *>(chart()->axes(Qt::Vertical)[0]);
		// 这里实际是放大到1.5倍,min变为x-(x-min)/1.5,max变为x+(max-x)/1.5(x到min、max的距离缩小到2/3倍)
        _axisX->setRange(chartPoint.x()/3 + _axisX->min()*2/3, chartPoint.x()/3 + _axisX->max()*2/3);
        _axisY->setRange(chartPoint.y()/3 + _axisY->min()*2/3, chartPoint.y()/3 + _axisY->max()*2/3);
    }
    else
    {
        chart()->zoomOut();
    }
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值