修复同一个群组可以重复循环打组的问题

This commit is contained in:
duanshengchao 2024-09-03 09:29:07 +08:00
parent a45c125cee
commit da6b9d023b
4 changed files with 29 additions and 6 deletions

View File

@ -8,6 +8,13 @@
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
#include <QPen> #include <QPen>
enum ShapeType
{
T_undefined,
T_item,
T_group
};
//基类采用模板形式QGraphicsItem是默认值,也可以是别的类型比如QGraphicsItemGroup这样不同的基类继承可以共用一些高层的行为定义 //基类采用模板形式QGraphicsItem是默认值,也可以是别的类型比如QGraphicsItemGroup这样不同的基类继承可以共用一些高层的行为定义
template <typename BaseType = QGraphicsItem> template <typename BaseType = QGraphicsItem>
class AbstractShapeType : public BaseType class AbstractShapeType : public BaseType
@ -16,6 +23,7 @@ public:
explicit AbstractShapeType(QGraphicsItem *parent = 0) explicit AbstractShapeType(QGraphicsItem *parent = 0)
: BaseType(parent) : BaseType(parent)
{ {
m_type = T_undefined;
m_pen = QPen(Qt::NoPen); m_pen = QPen(Qt::NoPen);
m_brush = QBrush(QColor(rand() % 32 * 8, rand() % 32 * 8, rand() % 32 * 8)); m_brush = QBrush(QColor(rand() % 32 * 8, rand() % 32 * 8, rand() % 32 * 8));
m_dWidth = m_dHeight = 0; m_dWidth = m_dHeight = 0;
@ -36,6 +44,8 @@ public:
} }
public: public:
virtual ShapeType getType() {return m_type;}
QPen pen() { return m_pen; } QPen pen() { return m_pen; }
void setPen(const QPen &pen) { m_pen = pen; } void setPen(const QPen &pen) { m_pen = pen; }
QColor penColor() { return m_pen.color(); } QColor penColor() { return m_pen.color(); }
@ -247,6 +257,7 @@ public:
} }
protected: protected:
ShapeType m_type;
QPen m_pen; QPen m_pen;
QBrush m_brush; QBrush m_brush;
double m_dWidth; double m_dWidth;

View File

@ -132,6 +132,12 @@ GraphicsItemGroup* DesignerScene::createGroup()
QList<QGraphicsItem*> listItem = selectedItems(); QList<QGraphicsItem*> listItem = selectedItems();
if(listItem.isEmpty()) if(listItem.isEmpty())
return nullptr; return nullptr;
else if(listItem.count() == 1) //判断只选中了一个时是不是已经打组,如果是不做操作,防止循环打组
{
AbstractShape* item = qgraphicsitem_cast<AbstractShape*>(listItem.first());
if(item && item->getType()==T_group)
return nullptr;
}
GraphicsItemGroup* group = new GraphicsItemGroup(); GraphicsItemGroup* group = new GraphicsItemGroup();
group->addItems(listItem); group->addItems(listItem);

View File

@ -4,6 +4,7 @@
GraphicsBaseItem::GraphicsBaseItem(QGraphicsItem *parent) GraphicsBaseItem::GraphicsBaseItem(QGraphicsItem *parent)
: AbstractShapeType<QGraphicsItem>(parent) : AbstractShapeType<QGraphicsItem>(parent)
{ {
m_type = T_item;
//初始化缩放操作用的handle //初始化缩放操作用的handle
m_vecHanle.reserve(H_left); m_vecHanle.reserve(H_left);
for(int i = H_leftTop; i <= H_left; i++) for(int i = H_leftTop; i <= H_left; i++)

View File

@ -7,6 +7,8 @@
GraphicsItemGroup::GraphicsItemGroup(QGraphicsItem *parent) GraphicsItemGroup::GraphicsItemGroup(QGraphicsItem *parent)
: AbstractShapeType<QGraphicsItemGroup>(parent) : AbstractShapeType<QGraphicsItemGroup>(parent)
{ {
m_type = T_group;
m_boundingRect = QRectF(); m_boundingRect = QRectF();
m_lastBoudingRect = QGraphicsItemGroup::boundingRect(); m_lastBoudingRect = QGraphicsItemGroup::boundingRect();
@ -211,7 +213,10 @@ void GraphicsItemGroup::moveOperationCopy(const QPointF& distance)
void GraphicsItemGroup::rotateOperationCopy(const double& dAngle) void GraphicsItemGroup::rotateOperationCopy(const double& dAngle)
{ {
if(m_pOperationCopy) if(m_pOperationCopy)
{
m_pOperationCopy->setRotation(dAngle); m_pOperationCopy->setRotation(dAngle);
}
} }
void GraphicsItemGroup::addItems(const QList<QGraphicsItem*>& items) void GraphicsItemGroup::addItems(const QList<QGraphicsItem*>& items)