#include "mygraphicsview.h" MyGraphicsView::MyGraphicsView(QWidget *parent, double gridUnit) : QGraphicsView(parent) { m_scene = new MyGraphicsScene(); m_scene->setSceneRect(0,0,SCENESIZE,SCENESIZE);//1016像素,1像素代表1毫米 this->setScene(m_scene); setMouseTracking(true); // 跟踪鼠标位置 m_scene->addGrid(gridUnit,m_scene->sceneRect()); connect(m_scene, SIGNAL(siCurrentIndex(int)), this, SIGNAL(siCurrentIndex(int))); } MyGraphicsView::~MyGraphicsView() { if(m_scene != NULL) { delete m_scene; m_scene = NULL; } } void MyGraphicsView::restoreView() { //还原缩放,恢复默认大小 this->resetTransform(); // 计算场景的中心点 // 获取场景中的矩形范围 QRectF sceneRect = m_scene->sceneRect(); // 计算场景的中心点 QPointF centerPoint = sceneRect.center(); // 获取当前视图的大小 int viewWidth = this->width(); int viewHeight = this->height(); // 计算滚动条应该移动的距离 // 目标是让场景的中心点与视图的中心点对齐 int hValue = centerPoint.x() - viewWidth / 2; int vValue = centerPoint.y() - viewHeight / 2; // 设置滚动条的位置 this->horizontalScrollBar()->setValue(hValue); this->verticalScrollBar()->setValue(vValue); m_scene->cleanScene(); } void MyGraphicsView::resizeEvent(QResizeEvent *event) { if(event == NULL){}//为了去掉警告 } void MyGraphicsView::mouseDoubleClickEvent(QMouseEvent *event) { qreal scaleFactor = this->matrix().m11(); if(scaleFactor >= 200){return;} if(event->buttons() & Qt::LeftButton && event->type() == QEvent::MouseButtonDblClick) { setTransformationAnchor(QGraphicsView::AnchorUnderMouse); scale(2.0, 2.0); } } void MyGraphicsView::mousePressEvent(QMouseEvent *event) { if(event->buttons() & Qt::LeftButton) { m_leftPressPoint = event->pos(); } QGraphicsView::mousePressEvent(event); } //恢复原状 void MyGraphicsView::mouseReleaseEvent(QMouseEvent *event) { QGraphicsView::mouseReleaseEvent(event); } void MyGraphicsView::mouseMoveEvent(QMouseEvent *event) { if(event->buttons() & Qt::LeftButton) { bool bl = m_scene->getCurSelectState(); //当scene选中某点时,不拖拽scene位置 if(bl == true) { return QGraphicsView::mouseMoveEvent(event); } m_leftReleasePoint = event->pos(); // 计算鼠标移动的距离 int deltaX = m_leftReleasePoint.x() - m_leftPressPoint.x(); int deltaY = m_leftReleasePoint.y() - m_leftPressPoint.y(); // 更新滚动条的位置 horizontalScrollBar()->setValue(horizontalScrollBar()->value() - deltaX); verticalScrollBar()->setValue(verticalScrollBar()->value() - deltaY); // 更新起始点,以便下次移动时使用 m_leftPressPoint = m_leftReleasePoint; } return QGraphicsView::mouseMoveEvent(event); } void MyGraphicsView::wheelEvent(QWheelEvent *event) { // 获取当前鼠标相对于view的位置; QPointF cursorPoint = event->pos(); // 获取当前鼠标相对于scene的位置; QPointF scenePos = this->mapToScene(QPoint(cursorPoint.x(), cursorPoint.y())); // 获取view的宽高; qreal viewWidth = this->viewport()->width(); qreal viewHeight = this->viewport()->height(); // 获取当前鼠标位置相当于view大小的横纵比例; qreal hScale = cursorPoint.x() / viewWidth; qreal vScale = cursorPoint.y() / viewHeight; int wheelDeltaValue = event->delta(); // 向上滚动,放大; if (wheelDeltaValue > 0) { this->scale(1.2, 1.2); } // 向下滚动,缩小; else { this->scale(1.0 / 1.2, 1.0 / 1.2); } // 将scene坐标转换为放大缩小后的坐标; QPointF viewPoint = this->matrix().map(scenePos); // 通过滚动条控制view放大缩小后的展示scene的位置; horizontalScrollBar()->setValue(int(viewPoint.x() - viewWidth * hScale)); verticalScrollBar()->setValue(int(viewPoint.y() - viewHeight * vScale)); } void MyGraphicsView::showEvent(QShowEvent *event) { horizontalScrollBar()->setValue(0); verticalScrollBar()->setValue(0); QGraphicsView::showEvent(event); } void MyGraphicsView::creatViewByData(QByteArray ary) { //还原缩放,恢复默认大小 this->resetTransform(); // 计算场景的中心点 // 获取场景中的矩形范围 QRectF sceneRect = m_scene->sceneRect(); // 计算场景的中心点 QPointF centerPoint = sceneRect.center(); // 获取当前视图的大小 int viewWidth = this->width(); int viewHeight = this->height(); // 计算滚动条应该移动的距离 // 目标是让场景的中心点与视图的中心点对齐 int hValue = centerPoint.x() - viewWidth / 2; int vValue = centerPoint.y() - viewHeight / 2; // 设置滚动条的位置 this->horizontalScrollBar()->setValue(hValue); this->verticalScrollBar()->setValue(vValue); m_scene->cleanScene(); m_scene->addItemToScene(ary); } void MyGraphicsView::creatViewByList(QList list) { restoreView(); m_scene->addItemListToScene(list); } void MyGraphicsView::enlargeView() { if(m_scene == NULL) { return; } QPointF cursorPoint; QPointF scenePos; bool bl = m_scene->getCurSelectState(); if(bl == false) { // 缩放视图 scale(1.2, 1.2); return; } else { cursorPoint = m_leftPressPoint; scenePos = this->mapToScene(QPoint(cursorPoint.x(), cursorPoint.y())); // 获取view的宽高; qreal viewWidth = this->viewport()->width(); qreal viewHeight = this->viewport()->height(); // 获取当前鼠标位置相当于view大小的横纵比例; qreal hScale = cursorPoint.x() / viewWidth; qreal vScale = cursorPoint.y() / viewHeight; this->scale(1.2, 1.2); // 将scene坐标转换为放大缩小后的坐标; QPointF viewPoint = this->matrix().map(scenePos); // 通过滚动条控制view放大缩小后的展示scene的位置; horizontalScrollBar()->setValue(int(viewPoint.x() - viewWidth * hScale)); verticalScrollBar()->setValue(int(viewPoint.y() - viewHeight * vScale)); } } void MyGraphicsView::narrowView() { if(m_scene == NULL) { return; } QPointF cursorPoint; QPointF scenePos; bool bl = m_scene->getCurSelectState(); if(bl == false) { // 缩放视图 this->scale(1.0 / 1.2, 1.0 / 1.2); return; } else { cursorPoint = m_leftPressPoint; scenePos = this->mapToScene(QPoint(cursorPoint.x(), cursorPoint.y())); // 获取view的宽高; qreal viewWidth = this->viewport()->width(); qreal viewHeight = this->viewport()->height(); // 获取当前鼠标位置相当于view大小的横纵比例; qreal hScale = cursorPoint.x() / viewWidth; qreal vScale = cursorPoint.y() / viewHeight; this->scale(1.0 / 1.2, 1.0 / 1.2); // 将scene坐标转换为放大缩小后的坐标; QPointF viewPoint = this->matrix().map(scenePos); // 通过滚动条控制view放大缩小后的展示scene的位置; horizontalScrollBar()->setValue(int(viewPoint.x() - viewWidth * hScale)); verticalScrollBar()->setValue(int(viewPoint.y() - viewHeight * vScale)); } } void MyGraphicsView::forwardAndBackward(int idx) { if(m_scene == NULL) { return; } bool bl = m_scene->initAPoint(); if(bl == false) { return; } m_scene->forwardAndBackward(idx); } int MyGraphicsView::getItemNums() { return m_scene->items().size(); } void MyGraphicsView::moveScene(int x,int y) { // 更新滚动条的位置 horizontalScrollBar()->setValue(horizontalScrollBar()->value() - x); verticalScrollBar()->setValue(verticalScrollBar()->value() - y); } void MyGraphicsView::autoView() { //还原缩放,恢复默认大小 this->resetTransform(); // 计算场景的中心点 // 获取场景中的矩形范围 QRectF sceneRect = m_scene->sceneRect(); // 计算场景的中心点 QPointF centerPoint = sceneRect.center(); // 获取当前视图的大小 int viewWidth = this->width(); int viewHeight = this->height(); // 计算滚动条应该移动的距离 // 目标是让场景的中心点与视图的中心点对齐 int hValue = centerPoint.x() - viewWidth / 2; int vValue = centerPoint.y() - viewHeight / 2; // 设置滚动条的位置 this->horizontalScrollBar()->setValue(hValue); this->verticalScrollBar()->setValue(vValue); } void MyGraphicsView::insertPoint(int dir) { if(m_scene == NULL) { return; } bool bl = m_scene->getCurSelectState(); if(bl == false) { return; } m_scene->insertPoint(dir); } void MyGraphicsView::removeSelectPoint() { if(m_scene == NULL) { return; } bool bl = m_scene->getCurSelectState(); if(bl == false) { return; } else { m_scene->removeSelectPoint(); } } void MyGraphicsView::setShapeType(int type) { m_scene->setShapeType(type); } QList MyGraphicsView::getPointList() { return m_scene->getPointList(); } void MyGraphicsView::cleanView() { m_scene->cleanScene(); } void MyGraphicsView::setAdsorption(bool adsorption) { m_scene->setAdsorption(adsorption); } void MyGraphicsView::setMaxSegmentLength(int value) { m_scene->setMaxSegmentLength(value); } int MyGraphicsView::getMaxSegmentLength() { return m_scene->getMaxSegmentLength(); } void MyGraphicsView::setXYMove(double valX,double valY) { m_scene->setXYMove(valX,valY); } //撤销最后一个图元 void MyGraphicsView::revokeLastItem() { m_scene->revokeLastItem(); } QList MyGraphicsView::getLineItemList() { return m_scene->getLineItemList(); } QList MyGraphicsView::getPathItemList() { return m_scene->getPathItemList(); }