Qchart实现左键缩放,左键框选放大,滚轮放大缩小,右键拖动,右键复位,右键清空数据,显示当前X,Y轴值

24 篇文章 0 订阅
4 篇文章 1 订阅

Qchart实现左键缩放,左键框选放大,滚轮放大缩小,右键拖动,右键复位,右键清空数据,显示当前X,Y轴值

在之前我们实现了QCustomplot曲线的显示设置,功能基本相同,也是左键缩放,左键框选放大,滚轮放大缩小,右键复位,右键清空数据,然后由于QCustomplot虽然兼容QT4,QT5但是样式过于一般,包括标题栏都需要自己去设置。所以按照之前的功能实现Qchart。

实现效果

右键菜单
在这里插入图片描述
右键长按拖动
在这里插入图片描述
左键框选放大,滚轮放大缩小
在这里插入图片描述

实现思想

首先也是先继承QchartView做自定义的通用控件,代码尽量通用,可以在以后的工程直接导入使用。
自定义控件使用,直接提升即可。不会的可以自行百度噢。

左键框选缩放,右键拖动

首先,我们需要去判断当前是否为左键
b_isLeftPress = true; 这个是标识,后面会用到
QGraphicsRectItem是一个图型选择框,创建在chart里防止内存泄漏
pt_lastPoint是我们最后鼠标释放是的点,在鼠标释放事件里会用到
b_isRightPress = true;右键拖动标志

if (event->button() == Qt::LeftButton)
        {
            pt_lastPoint = event->pos();
            b_isLeftPress = true;
            gr_RectItem = new QGraphicsRectItem(this->chart());
            gr_RectItem->setZValue(10);
            gr_RectItem->setRect(QRect(pt_lastPoint, pt_lastPoint));
            gr_RectItem->show();
            QPen pen = gr_RectItem->pen();
            pen.setColor(QColor(0, 120, 215));
            pen.setWidth(1);
            //        pen.setStyle(Qt::DashLine);
            gr_RectItem->setPen(pen);
            gr_RectItem->setBrush(QBrush(QColor(0, 120, 215, 100)));
        }
      else if (event->button() == Qt::RightButton)
        {
            setCursor(QCursor(Qt::SizeAllCursor));
            pt_lastPoint = event->pos();
            pt_currentPoint = cursor().pos();
            b_isRightPress = true;
        }

滚轮放大缩小

chart有自带的缩放的函数zoomIn 和 zoomout 这里代码有些冗余,非小白可以直接重新实现这里面的缩放。自己实现可能15行代码就够了。这段代码写的有些垃圾。

// 鼠标滚轮事件
void ChartView::wheelEvent(QWheelEvent *event)
{
    if (chart()->series().size())
    {   
        const QPoint curPos = event->pos();
        QPointF curVal = this->chart()->mapToValue(QPointF(curPos));

        const double factor = 1.5;//缩放比例
        if (b_ctrlPress)
        {//Y轴
            Zoom_Y(curVal, factor, event->delta());
        }
        else if (b_altPress)
        {//X轴
            Zoom_X(curVal, factor, event->delta());
        }
        else
        {
            Zoom_Y(curVal, factor, event->delta());
            Zoom_X(curVal, factor, event->delta());
        }
        QChartView::wheelEvent(event);
    }
}

// 放大X轴
void ChartView::Zoom_X(QPointF curVal, double factor, int delta)
{
    QValueAxis *axisX = dynamic_cast<QValueAxis*>(this->chart()->axisX());
    const double xMin = axisX->min();
    const double xMax = axisX->max();
    const double xCentral = curVal.x();

    double leftOffset;
    double rightOffset;
    if (delta > 0)
    {//放大
        leftOffset = 1.0 / factor * (xCentral - xMin);
        rightOffset = 1.0 / factor * (xMax - xCentral);
    }
    else
    {//缩小
        leftOffset = 1.0 * factor * (xCentral - xMin);
        rightOffset = 1.0 * factor * (xMax - xCentral);
    }

    this->chart()->axisX()->setRange(xCentral - leftOffset, xCentral + rightOffset);
}

// 放大Y轴
void ChartView::Zoom_Y(QPointF curVal, double factor, int delta)
{
    QValueAxis *axisY = dynamic_cast<QValueAxis*>(this->chart()->axisY());
    const double yMin = axisY->min();
    const double yMax = axisY->max();
    const double yCentral = curVal.y();

    double bottomOffset;
    double topOffset;
    if (delta > 0)
    {//放大
        bottomOffset = 1.0 / factor * (yCentral - yMin);
        topOffset = 1.0 / factor * (yMax - yCentral);
    }
    else
    {//缩小
        bottomOffset = 1.0 * factor * (yCentral - yMin);
        topOffset = 1.0 * factor * (yMax - yCentral);
    }

    this->chart()->axisY()->setRange(yCentral - bottomOffset, yCentral + topOffset);
}

源代码

有需要可以直接留言!免费发

  • 7
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值