实现图元移动

This commit is contained in:
duanshengchao 2024-08-12 10:53:32 +08:00
parent 343e62f396
commit 17bf78bd8a
4 changed files with 68 additions and 1 deletions

View File

@ -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() {}

View File

@ -61,7 +61,12 @@ protected:
static int ms_nDragHandle; //当前抓取的控制点
SelectorType m_type;
private:
bool m_bHoverOnHandel; //鼠标是否悬停在handel
QPointF m_movingItemIniPos; //图元移动时的初始点
QGraphicsPathItem* m_pMovingItemCopy; //图元移动时的副本
};
#endif

View File

@ -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)

View File

@ -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<GraphicsBaseItem*>(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;