实现图元移动
This commit is contained in:
parent
343e62f396
commit
17bf78bd8a
|
|
@ -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() {}
|
||||
|
|
|
|||
|
|
@ -61,7 +61,12 @@ protected:
|
|||
static int ms_nDragHandle; //当前抓取的控制点
|
||||
|
||||
SelectorType m_type;
|
||||
|
||||
private:
|
||||
bool m_bHoverOnHandel; //鼠标是否悬停在handel
|
||||
QPointF m_movingItemIniPos; //图元移动时的初始点
|
||||
QGraphicsPathItem* m_pMovingItemCopy; //图元移动时的副本
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue