实现图元移动
This commit is contained in:
parent
343e62f396
commit
17bf78bd8a
|
|
@ -33,8 +33,11 @@ public:
|
||||||
double height() { return m_dHeight; }
|
double height() { return m_dHeight; }
|
||||||
void setHeight(double);
|
void setHeight(double);
|
||||||
|
|
||||||
|
int collidesWithHandle(const QPointF&);
|
||||||
|
|
||||||
virtual QRectF boundingRect() const { return m_boundingRect; }
|
virtual QRectF boundingRect() const { return m_boundingRect; }
|
||||||
|
|
||||||
|
virtual QPainterPath shape() {}
|
||||||
virtual void updateHandles();
|
virtual void updateHandles();
|
||||||
virtual void resize(int,double, double, const QPointF&) {}
|
virtual void resize(int,double, double, const QPointF&) {}
|
||||||
virtual void updateCoordinate() {}
|
virtual void updateCoordinate() {}
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,12 @@ protected:
|
||||||
static int ms_nDragHandle; //当前抓取的控制点
|
static int ms_nDragHandle; //当前抓取的控制点
|
||||||
|
|
||||||
SelectorType m_type;
|
SelectorType m_type;
|
||||||
|
|
||||||
|
private:
|
||||||
bool m_bHoverOnHandel; //鼠标是否悬停在handel
|
bool m_bHoverOnHandel; //鼠标是否悬停在handel
|
||||||
|
QPointF m_movingItemIniPos; //图元移动时的初始点
|
||||||
|
QGraphicsPathItem* m_pMovingItemCopy; //图元移动时的副本
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,17 @@ void GraphicsBaseItem::setHeight(double height)
|
||||||
updateCoordinate();
|
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)
|
QVariant GraphicsBaseItem::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value)
|
||||||
{
|
{
|
||||||
if (change == QGraphicsItem::ItemSelectedHasChanged)
|
if (change == QGraphicsItem::ItemSelectedHasChanged)
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ BaseSelector::BaseSelector(QObject *parent)
|
||||||
{
|
{
|
||||||
m_type = ST_base;
|
m_type = ST_base;
|
||||||
m_bHoverOnHandel = false;
|
m_bHoverOnHandel = false;
|
||||||
|
m_pMovingItemCopy = nullptr;
|
||||||
}
|
}
|
||||||
BaseSelector::~BaseSelector()
|
BaseSelector::~BaseSelector()
|
||||||
{
|
{
|
||||||
|
|
@ -39,7 +40,32 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen
|
||||||
item = qgraphicsitem_cast<GraphicsBaseItem*>(items.first());
|
item = qgraphicsitem_cast<GraphicsBaseItem*>(items.first());
|
||||||
if(item)
|
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) //选中多个
|
else if (items.count() > 1) //选中多个
|
||||||
|
|
@ -85,8 +111,23 @@ void BaseSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene
|
||||||
|
|
||||||
item->resize(ms_nDragHandle, sx, sy, basePoint);
|
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)
|
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)
|
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);
|
view->setDragMode(QGraphicsView::NoDrag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(m_pMovingItemCopy)
|
||||||
|
{
|
||||||
|
scene->removeItem(m_pMovingItemCopy);
|
||||||
|
delete m_pMovingItemCopy;
|
||||||
|
m_pMovingItemCopy = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
ms_opMode = OM_none;
|
ms_opMode = OM_none;
|
||||||
m_bHoverOnHandel = false;
|
m_bHoverOnHandel = false;
|
||||||
ms_nDragHandle = H_none;
|
ms_nDragHandle = H_none;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue