From 17bf78bd8aa00b8c3915a2f98897d43602e2dcb2 Mon Sep 17 00:00:00 2001 From: duanshengchao <519970194@qq.com> Date: Mon, 12 Aug 2024 10:53:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=9B=BE=E5=85=83=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/graphicsItem/graphicsBaseItem.h | 3 ++ include/util/baseSelector.h | 5 +++ source/graphicsItem/graphicsBaseItem.cpp | 11 ++++++ source/util/baseSelector.cpp | 50 +++++++++++++++++++++++- 4 files changed, 68 insertions(+), 1 deletion(-) diff --git a/include/graphicsItem/graphicsBaseItem.h b/include/graphicsItem/graphicsBaseItem.h index 9991b4a..282e46f 100644 --- a/include/graphicsItem/graphicsBaseItem.h +++ b/include/graphicsItem/graphicsBaseItem.h @@ -33,8 +33,11 @@ public: double height() { return m_dHeight; } void setHeight(double); + int collidesWithHandle(const QPointF&); + virtual QRectF boundingRect() const { return m_boundingRect; } + virtual QPainterPath shape() {} virtual void updateHandles(); virtual void resize(int,double, double, const QPointF&) {} virtual void updateCoordinate() {} diff --git a/include/util/baseSelector.h b/include/util/baseSelector.h index 4294dee..63dee64 100644 --- a/include/util/baseSelector.h +++ b/include/util/baseSelector.h @@ -61,7 +61,12 @@ protected: static int ms_nDragHandle; //当前抓取的控制点 SelectorType m_type; + +private: bool m_bHoverOnHandel; //鼠标是否悬停在handel + QPointF m_movingItemIniPos; //图元移动时的初始点 + QGraphicsPathItem* m_pMovingItemCopy; //图元移动时的副本 + }; #endif diff --git a/source/graphicsItem/graphicsBaseItem.cpp b/source/graphicsItem/graphicsBaseItem.cpp index 3a24bd2..5514d46 100644 --- a/source/graphicsItem/graphicsBaseItem.cpp +++ b/source/graphicsItem/graphicsBaseItem.cpp @@ -44,6 +44,17 @@ void GraphicsBaseItem::setHeight(double height) updateCoordinate(); } +int GraphicsBaseItem::collidesWithHandle(const QPointF& point) +{ + for(auto it = m_vecHanle.begin(); it != m_vecHanle.end(); it++) + { + QPointF pt = (*it)->mapFromScene(point); + if((*it)->contains(pt)) + return (*it)->getTag(); + } + return HandleTag::H_none; +} + QVariant GraphicsBaseItem::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value) { if (change == QGraphicsItem::ItemSelectedHasChanged) diff --git a/source/util/baseSelector.cpp b/source/util/baseSelector.cpp index fed5b68..31b4449 100644 --- a/source/util/baseSelector.cpp +++ b/source/util/baseSelector.cpp @@ -13,6 +13,7 @@ BaseSelector::BaseSelector(QObject *parent) { m_type = ST_base; m_bHoverOnHandel = false; + m_pMovingItemCopy = nullptr; } BaseSelector::~BaseSelector() { @@ -39,7 +40,32 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen item = qgraphicsitem_cast(items.first()); if(item) { + //需要增加当前是否点击在控制点的判断函数 + if(ms_nDragHandle != H_none && ms_nDragHandle <= H_left) //在缩放控制点上 + ms_opMode = OM_scale; + else if(ms_nDragHandle > H_left) //编辑控制点上 + { + ms_opMode = OM_edit; + //setCursor(scene, Qt::ClosedHandCursor); + } + else + { + ms_opMode = OM_move; + setCursor(scene, Qt::ClosedHandCursor); + //创建移动时显示的item副本 + m_pMovingItemCopy = new QGraphicsPathItem(item->shape()); + m_pMovingItemCopy->setPen(Qt::DashLine); + m_pMovingItemCopy->setPos(item->pos()); + m_pMovingItemCopy->setTransformOriginPoint(item->transformOriginPoint()); + m_pMovingItemCopy->setTransform(item->transform()); + m_pMovingItemCopy->setRotation(item->rotation()); + m_pMovingItemCopy->setScale(item->scale()); + m_pMovingItemCopy->setZValue(item->zValue()); + scene->addItem(m_pMovingItemCopy); + + m_movingItemIniPos = item->pos(); + } } } else if (items.count() > 1) //选中多个 @@ -85,8 +111,23 @@ void BaseSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene item->resize(ms_nDragHandle, sx, sy, basePoint); } + else if(ms_nDragHandle > H_left && ms_opMode == OM_edit) //编辑形状 + { + + } + else if(ms_opMode == OM_move) + { + if(m_pMovingItemCopy) + m_pMovingItemCopy->setPos(m_movingItemIniPos + (ms_ptMouseLast - ms_ptMouseDown)); + } } } + + if (ms_opMode != OM_scale && items.count() > 1) //例如多选移动等采用默认行为 + { + scene->callParentEvent(event); + } + } void BaseSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene) @@ -108,7 +149,7 @@ void BaseSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, DesignerSc } else if(item && ms_opMode == OM_move && ms_ptMouseLast != ms_ptMouseDown) { - item->setPos(ms_ptMouseDown + (ms_ptMouseLast - ms_ptMouseDown)); + item->setPos(m_movingItemIniPos + (ms_ptMouseLast - ms_ptMouseDown)); } } @@ -119,6 +160,13 @@ void BaseSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, DesignerSc view->setDragMode(QGraphicsView::NoDrag); } + if(m_pMovingItemCopy) + { + scene->removeItem(m_pMovingItemCopy); + delete m_pMovingItemCopy; + m_pMovingItemCopy = nullptr; + } + ms_opMode = OM_none; m_bHoverOnHandel = false; ms_nDragHandle = H_none;