.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