From 0f6de6317ec58e7916d11f0edbd953a834770b7a Mon Sep 17 00:00:00 2001 From: duanshengchao <519970194@qq.com> Date: Tue, 3 Sep 2024 15:42:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=89=93=E7=BB=84=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=EF=BC=8C=E6=B6=88=E9=99=A4=E5=A4=9A=E5=B1=82=E7=BB=84?= =?UTF-8?q?=E7=BE=A4=E7=BB=93=E6=9E=84=EF=BC=8C=E4=BE=BF=E4=BA=8E=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=92=8C=E7=9B=B8=E5=85=B3=E5=8F=98=E6=8D=A2=E8=AE=A1?= =?UTF-8?q?=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/graphicsItem/graphicsBaseItem.h | 11 +++- include/graphicsItem/graphicsItemGroup.h | 1 + source/designerScene.cpp | 25 +++++++++ source/graphicsItem/graphicsBaseItem.cpp | 11 ++++ source/graphicsItem/graphicsItemGroup.cpp | 67 ++++++++++++++++++++--- source/util/baseSelector.cpp | 7 +++ source/util/rotationSelector.cpp | 2 +- 7 files changed, 114 insertions(+), 10 deletions(-) diff --git a/include/graphicsItem/graphicsBaseItem.h b/include/graphicsItem/graphicsBaseItem.h index de2776e..0c87359 100644 --- a/include/graphicsItem/graphicsBaseItem.h +++ b/include/graphicsItem/graphicsBaseItem.h @@ -28,6 +28,7 @@ public: m_brush = QBrush(QColor(rand() % 32 * 8, rand() % 32 * 8, rand() % 32 * 8)); m_dWidth = m_dHeight = 0; m_pOperationCopy = nullptr; + m_dSyncRotationByParent = 0.0; } virtual ~AbstractShapeType() @@ -256,6 +257,9 @@ public: return path; } + virtual void syncRotationDataFromParent(const double&) {} + virtual double getSyncRotationDataFromParent() {return m_dSyncRotationByParent;} + protected: ShapeType m_type; QPen m_pen; @@ -263,10 +267,12 @@ protected: double m_dWidth; double m_dHeight; QRectF m_boundingRect; - QRectF m_boundingRect_selected;//选中矩形框 + QRectF m_boundingRect_selected; //选中矩形框 + + double m_dSyncRotationByParent; //父项(被加入到某一组)的旋转数据,因为加入某一组后,对该组进行旋转,自身的旋转数据不会同步更新 QGraphicsPathItem* m_pOperationCopy; //图元移动和旋转时的操作副本 - QPointF m_movingIniPos; //移动副本开始移动初始点 + QPointF m_movingIniPos; //移动副本开始移动初始 QVector m_vecHanle; }; @@ -285,6 +291,7 @@ public: virtual void removeOperationCopy(); virtual void moveOperationCopy(const QPointF&); virtual void rotateOperationCopy(const double&); + virtual void syncRotationDataFromParent(const double&); //多边形、线段等点选创建的对象需要的函数 virtual void addPoint(const QPointF&) {} virtual bool endDrawing() { return true; } diff --git a/include/graphicsItem/graphicsItemGroup.h b/include/graphicsItem/graphicsItemGroup.h index f29a12b..9de766d 100644 --- a/include/graphicsItem/graphicsItemGroup.h +++ b/include/graphicsItem/graphicsItemGroup.h @@ -27,6 +27,7 @@ protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*); virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent*); virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange, const QVariant&); + virtual void syncRotationDataFromParent(const double&); private: QRectF m_lastBoudingRect; //记录上一时刻的boundingRect diff --git a/source/designerScene.cpp b/source/designerScene.cpp index 9076cc2..7d31fd8 100644 --- a/source/designerScene.cpp +++ b/source/designerScene.cpp @@ -138,6 +138,31 @@ GraphicsItemGroup* DesignerScene::createGroup() if(item && item->getType()==T_group) return nullptr; } + else //如果选择的有组群,则拆散该组群,并和其它单独的itme组合成新组群,防止多层组群出现,方便管理和计算 + { + for(int n=0; n(listItem[n]); + if(shape && shape->getType()==T_group) + { + GraphicsItemGroup* group = qgraphicsitem_cast(listItem[n]); + QList childItems = group->childItems(); + foreach (QGraphicsItem* child, childItems) + { + if(qgraphicsitem_cast(child)) + continue; + + group->removeFromGroup(child); + listItem.push_back(child); + } + + listItem.takeAt(n); + removeItem(group); + delete group; + n--; + } + } + } GraphicsItemGroup* group = new GraphicsItemGroup(); group->addItems(listItem); diff --git a/source/graphicsItem/graphicsBaseItem.cpp b/source/graphicsItem/graphicsBaseItem.cpp index f7e56a5..621d36b 100644 --- a/source/graphicsItem/graphicsBaseItem.cpp +++ b/source/graphicsItem/graphicsBaseItem.cpp @@ -81,6 +81,17 @@ void GraphicsBaseItem::rotateOperationCopy(const double& dAngle) m_pOperationCopy->setRotation(dAngle); } +void GraphicsBaseItem::syncRotationDataFromParent(const double& data) +{ + //m_dSyncRotationByParent = rotation() + data; + m_dSyncRotationByParent += data; + //让角度保持在正负180的区间,也就是上下两个半圈,这样易于象限判断 + if (m_dSyncRotationByParent > 180) + m_dSyncRotationByParent -= 360; + if (m_dSyncRotationByParent < -180) + m_dSyncRotationByParent += 360; +} + QVariant GraphicsBaseItem::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value) { if (change == QGraphicsItem::ItemSelectedHasChanged) diff --git a/source/graphicsItem/graphicsItemGroup.cpp b/source/graphicsItem/graphicsItemGroup.cpp index ba9054c..056276b 100644 --- a/source/graphicsItem/graphicsItemGroup.cpp +++ b/source/graphicsItem/graphicsItemGroup.cpp @@ -56,12 +56,12 @@ void GraphicsItemGroup::paint(QPainter* painter, const QStyleOptionGraphicsItem* painter->drawRect(m_boundingRect_selected); //绘制变换原点 - QPointF originPoint = transformOriginPoint(); + /*QPointF originPoint = transformOriginPoint(); //qDebug() << "originPoint:" << originPoint << " boundingRect:" << m_boundingRect; painter->setBrush(Qt::red); painter->drawEllipse(QPointF(0,0), 4, 4); painter->setBrush(Qt::blue); - painter->drawEllipse(originPoint, 4, 4); + painter->drawEllipse(originPoint, 4, 4);*/ } } @@ -86,6 +86,36 @@ QVariant GraphicsItemGroup::itemChange(QGraphicsItem::GraphicsItemChange change, return QGraphicsItemGroup::itemChange(change, value); } +void GraphicsItemGroup::syncRotationDataFromParent(const double& data) +{ + /*m_dSyncRotationByParent += data; + //让角度保持在正负180的区间,也就是上下两个半圈,这样易于象限判断 + if (m_dSyncRotationByParent > 180) + m_dSyncRotationByParent -= 360; + if (m_dSyncRotationByParent < -180) + m_dSyncRotationByParent += 360; + //同步给子项 + foreach (QGraphicsItem* item, childItems()) + { + if(qgraphicsitem_cast(item)) + continue; + + AbstractShape* shape = qgraphicsitem_cast(item); + if(shape && shape->getType()==T_group) + { + GraphicsItemGroup *group = qgraphicsitem_cast(item); + if(group) + group->syncRotationDataFromParent(data); + } + else + { + GraphicsBaseItem *baseItem = qgraphicsitem_cast(item); + if (baseItem) + baseItem->syncRotationDataFromParent(data); + } + }*/ +} + void GraphicsItemGroup::updateCoordinate() //当执行了resie和editShape函数后,boundingRect发生了变换,需要将item的原点(以中心点为原点)校准至boundingRect.center() { if (!parentItem()) @@ -121,8 +151,8 @@ void GraphicsItemGroup::updateCoordinate() //当执行了resie和editShape函数 //调用该组内所有item(过滤handle)相关函数 foreach (QGraphicsItem *item, childItems()) { - GraphicsBaseItem *baseItem = qgraphicsitem_cast(item); - if (baseItem && !qgraphicsitem_cast(baseItem)) + GraphicsBaseItem *baseItem = qgraphicsitem_cast(item); + if (baseItem && !qgraphicsitem_cast(baseItem)) { baseItem->updateCoordinate(); } @@ -161,8 +191,8 @@ void GraphicsItemGroup::resize(int nHandle,double dSX, double dSY, const QPointF //调用该组内所有item(过滤handle)相关函数 foreach (QGraphicsItem *item, childItems()) { - GraphicsBaseItem *baseItem = qgraphicsitem_cast(item); - if (baseItem && !qgraphicsitem_cast(baseItem)) + GraphicsBaseItem *baseItem = qgraphicsitem_cast(item); + if (baseItem && !qgraphicsitem_cast(baseItem)) { baseItem->resize(nHandle, dSX, dSY, baseItem->mapFromParent(basePoint)); } @@ -196,7 +226,30 @@ void GraphicsItemGroup::removeOperationCopy() if(this->pos() != m_pOperationCopy->pos()) this->setPos(m_pOperationCopy->pos()); //本体移动到副本的位置 if(this->rotation() != m_pOperationCopy->rotation()) - this->setRotation(m_pOperationCopy->rotation()); //本体旋转至副本的角度 + { + double dAngle = m_pOperationCopy->rotation(); + this->setRotation(dAngle); //本体旋转至副本的角度 + //子item的旋转数据并不会和所在组同步,需要手动同步 + foreach (QGraphicsItem* item, childItems()) + { + if(qgraphicsitem_cast(item)) + continue; + + // AbstractShape* shape = qgraphicsitem_cast(item); + // if(shape && shape->getType()==T_group) + // { + // GraphicsItemGroup *group = qgraphicsitem_cast(item); + // if(group) + // group->syncRotationDataFromParent(dAngle); + // } + // else + { + GraphicsBaseItem *baseItem = qgraphicsitem_cast(item); + if (baseItem) + baseItem->syncRotationDataFromParent(dAngle); + } + } + } scene->removeItem(m_pOperationCopy); delete m_pOperationCopy; diff --git a/source/util/baseSelector.cpp b/source/util/baseSelector.cpp index bdba19c..22f3248 100644 --- a/source/util/baseSelector.cpp +++ b/source/util/baseSelector.cpp @@ -129,6 +129,13 @@ void BaseSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene { //划分为四组区间范围,分别水平组、垂直组、一三象限倾斜组、二四象限倾斜组,每组由两个对称区间构成 double dRotation = item->rotation(); + dRotation += item->getSyncRotationDataFromParent(); + //让角度保持在正负180的区间,也就是上下两个半圈,这样易于象限判断 + if (dRotation > 180) + dRotation -= 360; + if (dRotation < -180) + dRotation += 360; + //qDebug() << "selfRotation:" << item->rotation() << " syncRotation:" << item->getSyncRotationDataFromParent() << " fininalRotatio:" << dRotation; double dTileAngle = 15.0; switch (nHandle) diff --git a/source/util/rotationSelector.cpp b/source/util/rotationSelector.cpp index fc0b2ca..28e197d 100644 --- a/source/util/rotationSelector.cpp +++ b/source/util/rotationSelector.cpp @@ -43,7 +43,7 @@ void RotationSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerS rotationAngle += 360; item->rotateOperationCopy(rotationAngle); - //qDebug() << " rotationAngle:" << rotationAngle; + //qDebug() << "rotationAngle: " << rotationAngle; } } }