From b234cdd3cafb3a2af312b63b8d0e8c4cee740bd2 Mon Sep 17 00:00:00 2001 From: duanshengchao <519970194@qq.com> Date: Wed, 20 Nov 2024 14:40:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=87=87=E7=94=A8=E6=8B=96?= =?UTF-8?q?=E6=8B=BD=E6=96=B9=E5=BC=8F=E8=BF=9B=E8=A1=8C=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E7=9A=84item=E5=92=8C=E7=BC=A9=E6=94=BE=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=9C=89=E8=BD=BB=E5=BE=AE=E6=BC=82=E7=A7=BB=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/graphicsItem/graphicsBaseItem.h | 26 ++++++++++++++------- include/graphicsItem/graphicsItemGroup.h | 7 +++--- include/util/creatingSelector.h | 2 +- source/graphicsItem/graphicsItemGroup.cpp | 7 ++++-- source/graphicsItem/graphicsPolygonItem.cpp | 4 ++-- source/graphicsItem/graphicsRectItem.cpp | 1 + source/operationCommand.cpp | 17 +++++++++++--- source/util/creatingSelector.cpp | 19 ++++++++------- 8 files changed, 54 insertions(+), 29 deletions(-) diff --git a/include/graphicsItem/graphicsBaseItem.h b/include/graphicsItem/graphicsBaseItem.h index 0c87359..6ad0361 100644 --- a/include/graphicsItem/graphicsBaseItem.h +++ b/include/graphicsItem/graphicsBaseItem.h @@ -122,32 +122,40 @@ public: virtual QPointF getSymmetricPointPos(int nHandle) //获取对称点的坐标位置,缩放的时候需要以对称点为锚点 { QPointF pt; - //编号从1开始,因此下标需要-1 + //handle的位置相对boundingRect会有一个向外的错位,因此直接采用bounddingRect的相应位置会更精准 switch (nHandle) { case H_leftTop: - pt = m_vecHanle.at(H_rightBottom - 1)->pos(); + //pt = m_vecHanle.at(H_rightBottom - 1)->pos(); + pt = m_boundingRect.bottomRight(); break; case H_top: - pt = m_vecHanle.at(H_bottom - 1)->pos(); + //pt = m_vecHanle.at(H_bottom - 1)->pos(); + pt = QPointF(m_boundingRect.width() * 0.5, m_boundingRect.bottom()); break; case H_rightTop: - pt = m_vecHanle.at(H_leftBottom - 1)->pos(); + //pt = m_vecHanle.at(H_leftBottom - 1)->pos(); + pt = m_boundingRect.bottomLeft(); break; case H_right: - pt = m_vecHanle.at(H_left - 1)->pos(); + //pt = m_vecHanle.at(H_left - 1)->pos(); + pt = QPointF(m_boundingRect.left(), m_boundingRect.height() * 0.5); break; case H_rightBottom: - pt = m_vecHanle.at(H_leftTop - 1)->pos(); + //pt = m_vecHanle.at(H_leftTop - 1)->pos(); + pt = m_boundingRect.topLeft(); break; case H_bottom: - pt = m_vecHanle.at(H_top - 1)->pos(); + //pt = m_vecHanle.at(H_top - 1)->pos(); + pt = QPointF(m_boundingRect.width() * 0.5, m_boundingRect.top()); break; case H_leftBottom: - pt = m_vecHanle.at(H_rightTop - 1)->pos(); + //pt = m_vecHanle.at(H_rightTop - 1)->pos(); + pt = m_boundingRect.topRight(); break; case H_left: - pt = m_vecHanle.at(H_right - 1)->pos(); + //pt = m_vecHanle.at(H_right - 1)->pos(); + pt = QPointF(m_boundingRect.right(), m_boundingRect.height() * 0.5); break; default: break; diff --git a/include/graphicsItem/graphicsItemGroup.h b/include/graphicsItem/graphicsItemGroup.h index 9de766d..1a39cf8 100644 --- a/include/graphicsItem/graphicsItemGroup.h +++ b/include/graphicsItem/graphicsItemGroup.h @@ -20,7 +20,7 @@ public: void rotateOperationCopy(const double&); void addItems(const QList&); - QList getItems() {return m_listItem;} + //QList getItems() {return m_listItem;} protected: virtual QPainterPath shape(); @@ -30,8 +30,9 @@ protected: virtual void syncRotationDataFromParent(const double&); private: - QRectF m_lastBoudingRect; //记录上一时刻的boundingRect - QList m_listItem; + QRectF m_lastBoudingRect; //记录上一时刻的boundingRect + QPainterPath m_painterPath; + //QList m_listItem; }; #endif diff --git a/include/util/creatingSelector.h b/include/util/creatingSelector.h index ac1e84d..39830fb 100644 --- a/include/util/creatingSelector.h +++ b/include/util/creatingSelector.h @@ -38,7 +38,7 @@ private: CreatingMethod m_creatingMethod; GraphicsItemType m_creatingItemType; GraphicsBaseItem* m_pCreatingItem; - QPointF m_scalBasePoint; + //QPointF m_scalBasePoint; }; #endif diff --git a/source/graphicsItem/graphicsItemGroup.cpp b/source/graphicsItem/graphicsItemGroup.cpp index 056276b..4aa4184 100644 --- a/source/graphicsItem/graphicsItemGroup.cpp +++ b/source/graphicsItem/graphicsItemGroup.cpp @@ -183,6 +183,8 @@ void GraphicsItemGroup::resize(int nHandle,double dSX, double dSY, const QPointF trans.translate(-basePoint.x(), -basePoint.y()); prepareGeometryChange(); + //如果直接将变换应用到item(setTransform(trans)),相当于把坐标进行拉伸,会有明显的拉伸感,所以应用到图形点上效果更好 + //setTransform(trans); m_boundingRect = trans.mapRect(m_lastBoudingRect); m_dWidth = m_boundingRect.width(); m_dHeight = m_boundingRect.height(); @@ -194,7 +196,8 @@ void GraphicsItemGroup::resize(int nHandle,double dSX, double dSY, const QPointF GraphicsBaseItem *baseItem = qgraphicsitem_cast(item); if (baseItem && !qgraphicsitem_cast(baseItem)) { - baseItem->resize(nHandle, dSX, dSY, baseItem->mapFromParent(basePoint)); + //qDebug() << "groupBounding: " << m_boundingRect << " itemBounding:" << baseItem->boundingRect(); + baseItem->resize(nHandle, dSX, dSY, baseItem->mapFromParent(basePoint)); } } } @@ -278,7 +281,7 @@ void GraphicsItemGroup::addItems(const QList& items) { item->setSelected(false); addToGroup(item); - m_listItem.push_back(item); + //m_listItem.push_back(item); } updateCoordinate(); diff --git a/source/graphicsItem/graphicsPolygonItem.cpp b/source/graphicsItem/graphicsPolygonItem.cpp index 6d79f40..787b4bf 100644 --- a/source/graphicsItem/graphicsPolygonItem.cpp +++ b/source/graphicsItem/graphicsPolygonItem.cpp @@ -51,8 +51,8 @@ void GraphicPolygonItem::updateCoordinate() //当执行了resie和editShape函 prepareGeometryChange(); //更改图形绘制节点坐标,让图形中心和原点对齐 QPolygonF ptsOnScene = mapToScene(m_points); //所有操作都在scene坐标系下进行,然后在还原至item坐标系,否则会有跳转 - for(int i=0; igetItems(); + foreach (QGraphicsItem *item, group->childItems()) + { + if(!qgraphicsitem_cast(item)) + m_listItem.push_back(item); + } + //m_listItem = group->getItems(); } CreateItemGoupCommand::~CreateItemGoupCommand() { @@ -108,7 +113,12 @@ DestroyItemGoupCommand::DestroyItemGoupCommand(GraphicsItemGroup* group, QGraphi { m_pGroup = group; m_pGraphicsScene = scene; - m_listItem = group->getItems(); + foreach (QGraphicsItem *item, group->childItems()) + { + if(!qgraphicsitem_cast(item)) + m_listItem.push_back(item); + } + //m_listItem = group->getItems(); } DestroyItemGoupCommand::~DestroyItemGoupCommand() { @@ -120,8 +130,9 @@ void DestroyItemGoupCommand::undo() item->setSelected(false); m_pGroup->addToGroup(item); } - m_pGroup->setSelected(true); + m_pGraphicsScene->addItem(m_pGroup); + m_pGroup->setSelected(true); m_pGraphicsScene->update(); } void DestroyItemGoupCommand::redo() diff --git a/source/util/creatingSelector.cpp b/source/util/creatingSelector.cpp index 42ad089..eb70a4f 100644 --- a/source/util/creatingSelector.cpp +++ b/source/util/creatingSelector.cpp @@ -10,7 +10,7 @@ CreatingSelector::CreatingSelector(QObject *parent) m_type = ST_cerating; m_creatingMethod = CM_drag; m_pCreatingItem = nullptr; - m_scalBasePoint = QPointF(); + //m_scalBasePoint = QPointF(); } CreatingSelector::~CreatingSelector() { @@ -34,7 +34,7 @@ void CreatingSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, Designer case GIT_rect: { m_creatingMethod = CM_drag; - m_pCreatingItem = new GraphicsRectItem(QRect(1, 1, 1, 1)); + m_pCreatingItem = new GraphicsRectItem(QRect(-2, -2, 4, 4)); } break; case GIT_roundRect: @@ -86,22 +86,23 @@ void CreatingSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerS if (m_pCreatingItem && m_creatingMethod == CM_drag) { - if(m_scalBasePoint.isNull()) //基准点不能采用临时变量,因为handle的坐标也在不断变化,计算会出现问题 + /*if(m_scalBasePoint.isNull()) //基准点不能采用临时变量,因为handle的坐标也在不断变化,计算会出现问题 { - m_scalBasePoint = m_pCreatingItem->getSymmetricPointPos(ms_nDragHandle); + m_scalBasePoint = m_pCreatingItem->getSymmetricPointPos(ms_nDragHandle); qDebug() << m_scalBasePoint; if(m_scalBasePoint.x() == 0) m_scalBasePoint.setX(1); if(m_scalBasePoint.y() == 0) m_scalBasePoint.setY(1); - } + }*/ + QPointF scaleBasePoint = m_pCreatingItem->boundingRect().topLeft(); //计算缩放倍数 - QPointF iniDelta = m_pCreatingItem->mapFromScene(ms_ptMouseDown) - m_scalBasePoint; - QPointF lastDelta = m_pCreatingItem->mapFromScene(ms_ptMouseLast) - m_scalBasePoint; + QPointF iniDelta = m_pCreatingItem->mapFromScene(ms_ptMouseDown) - scaleBasePoint; + QPointF lastDelta = m_pCreatingItem->mapFromScene(ms_ptMouseLast) - scaleBasePoint; double sx = lastDelta.x() / iniDelta.x(); double sy = lastDelta.y() / iniDelta.y(); - m_pCreatingItem->resize(ms_nDragHandle, sx, sy, m_scalBasePoint); + m_pCreatingItem->resize(ms_nDragHandle, sx, sy, scaleBasePoint); } else if (m_pCreatingItem && m_creatingMethod == CM_click) { @@ -130,7 +131,7 @@ void CreatingSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, Design ms_nDragHandle = H_none; m_pCreatingItem = nullptr; - m_scalBasePoint = QPointF(); + //m_scalBasePoint = QPointF(); setCursor(scene, Qt::ArrowCursor); emit setWorkingSelector(ST_base); }