diff --git a/include/util/creatingSelector.h b/include/util/creatingSelector.h index d26c964..573741c 100644 --- a/include/util/creatingSelector.h +++ b/include/util/creatingSelector.h @@ -31,6 +31,7 @@ public: private: GraphicsItemType m_creatingType; GraphicsBaseItem* m_pCreatingItem; + QPointF m_scalBasePoint; }; #endif diff --git a/include/util/scalingSelector.h b/include/util/scalingSelector.h index 8ffdd11..e12333f 100644 --- a/include/util/scalingSelector.h +++ b/include/util/scalingSelector.h @@ -23,6 +23,8 @@ public: void mouseMoveEvent(QGraphicsSceneMouseEvent*, DesignerScene*); void mouseReleaseEvent(QGraphicsSceneMouseEvent*, DesignerScene*); +private: + QPointF m_scalBasePoint; }; #endif diff --git a/source/graphicsItem/graphicsRectItem.cpp b/source/graphicsItem/graphicsRectItem.cpp index d3360aa..b70e497 100644 --- a/source/graphicsItem/graphicsRectItem.cpp +++ b/source/graphicsItem/graphicsRectItem.cpp @@ -23,7 +23,6 @@ GraphicsRectItem::GraphicsRectItem(const QRect &rect, bool isRound, QGraphicsIte pHandle2->setType(T_editShape); pHandle2->setTag(H_edit+1); m_vecHanle.push_back(pHandle2); - } } @@ -75,11 +74,11 @@ void GraphicsRectItem::updateCoordinate() if (!parentItem()) { prepareGeometryChange(); + //创建时boundingRect原点不在中心,刷新boundingRect并将变换原点设为中心点 m_boundingRect = QRectF(-m_dWidth / 2, -m_dHeight / 2, m_dWidth, m_dHeight); - setTransform(transform().translate(delta.x(), delta.y())); setTransformOriginPoint(m_boundingRect.center()); + //原点坐标变化后跟根据新坐标调整位置 moveBy(-delta.x(), -delta.y()); - setTransform(transform().translate(-delta.x(), -delta.y())); updateHandles(); } @@ -118,6 +117,8 @@ void GraphicsRectItem::resize(int nHandle,double dSX, double dSY, const QPointF& case H_bottom: dSX = 1; //拖拽的是顶点底点,为垂直缩放,忽略水平变化 break; + default: + break; } QTransform trans; diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index bbc2998..4179d07 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -59,7 +59,8 @@ void CMainWindow::initializeDockUi() // Set central widget m_pDrawingPanel = new DrawingPanel(); - connect(m_pDrawingPanel->getDesignerScene(), SIGNAL(signalAddItem(QGraphicsItem*)), this, SLOT(onSignal_addItem(QGraphicsItem*))); + DesignerScene* designerScene = m_pDrawingPanel->getDesignerScene(); + connect(designerScene, SIGNAL((QGraphicsItem*)), this, SLOT(onSignal_addItem(QGraphicsItem*))); CDockWidget* CentralDockWidget = new CDockWidget("CentralWidget"); CentralDockWidget->setWidget(m_pDrawingPanel); auto* CentralDockArea = DockManager->setCentralWidget(CentralDockWidget); diff --git a/source/util/baseSelector.cpp b/source/util/baseSelector.cpp index 5681eed..2e01e8e 100644 --- a/source/util/baseSelector.cpp +++ b/source/util/baseSelector.cpp @@ -49,7 +49,8 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen else if(ms_nDragHandle > H_left) //编辑控制点上 { m_opMode = OM_edit; - //setCursor(scene, Qt::ClosedHandCursor); + setCursor(scene, Qt::ClosedHandCursor); + emit setWorkingSelector(ST_editing); } else { diff --git a/source/util/creatingSelector.cpp b/source/util/creatingSelector.cpp index 8a0d682..70efabd 100644 --- a/source/util/creatingSelector.cpp +++ b/source/util/creatingSelector.cpp @@ -8,6 +8,7 @@ CreatingSelector::CreatingSelector(QObject *parent) { m_type = ST_cerating; m_pCreatingItem = nullptr; + m_scalBasePoint = QPointF(); } CreatingSelector::~CreatingSelector() { @@ -40,29 +41,32 @@ void CreatingSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, Designer m_pCreatingItem->setSelected(true); ms_nDragHandle = H_rightBottom; + setCursor(scene, Qt::CrossCursor); } void CreatingSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene) { - setCursor(scene, Qt::CrossCursor); ms_ptMouseLast = event->scenePos(); if (m_pCreatingItem) { - QPointF basePoint = m_pCreatingItem->getSymmetricPointPos(ms_nDragHandle); - if(basePoint.x() == 0) - basePoint.setX(1); - if(basePoint.y() == 0) - basePoint.setY(1); + if(m_scalBasePoint.isNull()) //基准点不能采用临时变量,因为handle的坐标也在不断变化,计算会出现问题 + { + m_scalBasePoint = m_pCreatingItem->getSymmetricPointPos(ms_nDragHandle); + if(m_scalBasePoint.x() == 0) + m_scalBasePoint.setX(1); + if(m_scalBasePoint.y() == 0) + m_scalBasePoint.setY(1); + } //计算缩放倍数 - QPointF iniDelta = m_pCreatingItem->mapFromScene(ms_ptMouseDown) - basePoint; - QPointF lastDelta = m_pCreatingItem->mapFromScene(ms_ptMouseLast) - basePoint; + QPointF iniDelta = m_pCreatingItem->mapFromScene(ms_ptMouseDown) - m_scalBasePoint; + QPointF lastDelta = m_pCreatingItem->mapFromScene(ms_ptMouseLast) - m_scalBasePoint; double sx = lastDelta.x() / iniDelta.x(); double sy = lastDelta.y() / iniDelta.y(); - m_pCreatingItem->resize(ms_nDragHandle, sx, sy, basePoint); + m_pCreatingItem->resize(ms_nDragHandle, sx, sy, m_scalBasePoint); } } @@ -85,6 +89,7 @@ void CreatingSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, Design ms_nDragHandle = H_none; m_pCreatingItem = nullptr; + m_scalBasePoint = QPointF(); setCursor(scene, Qt::ArrowCursor); emit setWorkingSelector(ST_base); } diff --git a/source/util/scalingSelector.cpp b/source/util/scalingSelector.cpp index 3a49f60..f742374 100644 --- a/source/util/scalingSelector.cpp +++ b/source/util/scalingSelector.cpp @@ -7,6 +7,7 @@ ScalingSelector::ScalingSelector(QObject *parent) : BaseSelector(parent) { m_type = ST_scaling; + m_scalBasePoint = QPointF(); } ScalingSelector::~ScalingSelector() { @@ -29,19 +30,22 @@ void ScalingSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerSc { if(ms_nDragHandle != H_none) { - QPointF basePoint = item->getSymmetricPointPos(ms_nDragHandle); - if(basePoint.x() == 0) - basePoint.setX(1); - if(basePoint.y() == 0) - basePoint.setY(1); + if(m_scalBasePoint.isNull()) //基准点不能采用临时变量,因为handle的坐标也在不断变化,计算会出现问题 + { + m_scalBasePoint = item->getSymmetricPointPos(ms_nDragHandle); + if(m_scalBasePoint.x() == 0) + m_scalBasePoint.setX(1); + if(m_scalBasePoint.y() == 0) + m_scalBasePoint.setY(1); + } //计算缩放倍数 - QPointF iniDelta = item->mapFromScene(ms_ptMouseDown) - basePoint; - QPointF lastDelta = item->mapFromScene(ms_ptMouseLast) - basePoint; + QPointF iniDelta = item->mapFromScene(ms_ptMouseDown) - m_scalBasePoint; + QPointF lastDelta = item->mapFromScene(ms_ptMouseLast) - m_scalBasePoint; double sx = lastDelta.x() / iniDelta.x(); double sy = lastDelta.y() / iniDelta.y(); - item->resize(ms_nDragHandle, sx, sy, basePoint); + item->resize(ms_nDragHandle, sx, sy, m_scalBasePoint); } } } @@ -60,6 +64,7 @@ void ScalingSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, Designe } ms_nDragHandle = H_none; + m_scalBasePoint = QPointF(); setCursor(scene, Qt::ArrowCursor); emit setWorkingSelector(ST_base); } diff --git a/source/util/selectorManager.cpp b/source/util/selectorManager.cpp index 19fea4a..54d2dd6 100644 --- a/source/util/selectorManager.cpp +++ b/source/util/selectorManager.cpp @@ -2,6 +2,7 @@ #include "util/creatingSelector.h" #include "util/movingSelector.h" #include "util/scalingSelector.h" +#include "util/EditingSelector.h" SelectorManager* SelectorManager::m_pInstance = nullptr; @@ -23,6 +24,9 @@ SelectorManager::SelectorManager(QObject *parent) ScalingSelector* scalingSelector = new ScalingSelector(this); connect(scalingSelector, SIGNAL(setWorkingSelector(SelectorType)), this, SLOT(onSignal_setWorkingSelector(SelectorType))); m_vecSelectors.push_back(scalingSelector); + EditingSelector* editingSelector = new EditingSelector(this); + connect(editingSelector, SIGNAL(setWorkingSelector(SelectorType)), this, SLOT(onSignal_setWorkingSelector(SelectorType))); + m_vecSelectors.push_back(editingSelector); m_curSelector = ST_base; }