欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > QT实现曲线图缩放、拖拽以及框选放大

QT实现曲线图缩放、拖拽以及框选放大

2025/9/23 11:04:35 来源:https://blog.csdn.net/qq_38220144/article/details/147784324  浏览:    关键词:QT实现曲线图缩放、拖拽以及框选放大

.h文件

protected:    void saveAxisRange();void wheelEvent(QWheelEvent *event) override;void mousePressEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent *event) override;void mouseReleaseEvent(QMouseEvent *event) override;private:QPoint m_lastPoint;bool m_isPress = false;  //这里我把平移的判定初始化成了false,解决鼠标一移进QchartView就跟随移动的情况bool m_ctrlPress;bool m_alreadySaveRange;double m_xMin, m_xMax, m_yMin, m_yMax;QGraphicsSimpleTextItem* m_coordItem;// 框选bool m_isSelecting = false;        // 是否正在框选QPoint m_selectionStart;           // 框选起点QGraphicsRectItem* m_selectionRect = nullptr; // 选框图形项

.cpp文件

void saveAxisRange()
{QValueAxis *axisX = dynamic_cast<QValueAxis*>(this->chart()->axisX());m_xMin = axisX->min();m_xMax = axisX->max();QValueAxis *axisY = dynamic_cast<QValueAxis*>(this->chart()->axisY());m_yMin = axisY->min();m_yMax = axisY->max();
}void wheelEvent(QWheelEvent *event)
{获取当前轴的缩放因子(0.9为缩小,1.1为放大)//const double zoomFactor = 0.9;//const double minRange = 0.01; // 防止缩放到负数或过小获取当前轴范围//QValueAxis* axisX = qobject_cast<QValueAxis*>(chart()->axes(Qt::Horizontal).first());//QValueAxis* axisY = qobject_cast<QValueAxis*>(chart()->axes(Qt::Vertical).first());//if(!axisX || !axisY)//{//    return;//}计算缩放方向(向上滚为缩小,向下滚为放大)//double delta = event->angleDelta().y() > 0 ? zoomFactor : 1.0 / zoomFactor;根据修饰键选择缩放轴//if(event->modifiers() & Qt::ControlModifier)//{//    // 缩放Y轴//    double newMinY = axisY->min() * delta;//    double newMaxY = axisY->max() * delta;//    if(newMaxY - newMinY > minRange)//    {//        axisY->setRange(newMinY, newMaxY);//    }//}//else//{//    // 缩放X轴//    double newMinX = axisX->min() * delta;//    double newMaxX = axisX->max() * delta;//    if(newMaxX - newMinX > minRange)//    {//        axisX->setRange(newMinX, newMaxX);//    }//}//event->accept();const QPoint curPos = event->pos();QPointF curVal = this->chart()->mapToValue(QPointF(curPos));if(!m_alreadySaveRange){this->saveAxisRange();m_alreadySaveRange = true;}const double factor = 1.5;//缩放比例if(event->modifiers() & Qt::ControlModifier){//Y轴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(event->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);}else{//X轴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(event->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);}
}void mousePressEvent(QMouseEvent *event)
{//if(event->button() == Qt::LeftButton)//{//    m_lastPoint = event->pos();//    m_isPress = true;//}if(event->button() == Qt::LeftButton){// 检测 Ctrl 键是否按下if(QApplication::keyboardModifiers() & Qt::ControlModifier){// 开始框选m_isSelecting = true;m_selectionStart = event->pos();// 创建选框图形项if(!m_selectionRect){m_selectionRect = new QGraphicsRectItem();m_selectionRect->setPen(QPen(Qt::blue, 1, Qt::DashLine));m_selectionRect->setBrush(QColor(100, 100, 255, 50));chart()->scene()->addItem(m_selectionRect);}}else{// 正常平移模式m_lastPoint = event->pos();m_isPress = true;}}
}void mouseMoveEvent(QMouseEvent *event)
{/*if(!m_coordItem){m_coordItem = new QGraphicsSimpleTextItem(this->chart());m_coordItem->setZValue(5);m_coordItem->setPos(100, 60);m_coordItem->show();}const QPoint curPos = event->pos();if(m_isPress){QPoint offset = curPos - m_lastPoint;m_lastPoint = curPos;if(!m_alreadySaveRange){this->saveAxisRange();m_alreadySaveRange = true;}this->chart()->scroll(-offset.x(), offset.y());}*/// 更新坐标显示(原功能保留)if(!m_coordItem){m_coordItem = new QGraphicsSimpleTextItem(chart());m_coordItem->setZValue(5);m_coordItem->setPos(100, 60);}// 处理框选逻辑if(m_isSelecting){// 更新选框图形QRectF rect(m_selectionStart, event->pos());m_selectionRect->setRect(rect.normalized());}// 处理平移逻辑else if(m_isPress){QPoint offset = event->pos() - m_lastPoint;m_lastPoint = event->pos();if(!m_alreadySaveRange){saveAxisRange();m_alreadySaveRange = true;}chart()->scroll(-offset.x(), offset.y());}
}void mouseReleaseEvent(QMouseEvent *event)
{//m_isPress = false;//if(event->button() == Qt::RightButton)//{//    if(m_alreadySaveRange)//    {//        this->chart()->axisX()->setRange(m_xMin, m_xMax);//        this->chart()->axisY()->setRange(m_yMin, m_yMax);//    }//}if(event->button() == Qt::LeftButton){if(m_isSelecting){// 应用框选缩放QRectF rect = m_selectionRect->rect();QPointF topLeft = chart()->mapToValue(rect.topLeft());QPointF bottomRight = chart()->mapToValue(rect.bottomRight());chart()->axisX()->setRange(topLeft.x(), bottomRight.x());chart()->axisY()->setRange(bottomRight.y(), topLeft.y()); // Y轴方向反转// 清理选框chart()->scene()->removeItem(m_selectionRect);delete m_selectionRect;m_selectionRect = nullptr;m_isSelecting = false;}else{m_isPress = false;}}// 原右键恢复功能保留else if(event->button() == Qt::RightButton){if(m_alreadySaveRange){chart()->axisX()->setRange(m_xMin, m_xMax);chart()->axisY()->setRange(m_yMin, m_yMax);}}
}

构造函数中添加代码:

    grabGesture(Qt::PinchGesture);                              //这里只grabGesture了PinchGesture

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词