#include "util/baseSelector.h" #include #include #include OperationMode BaseSelector::ms_opMode = OM_none; QPointF BaseSelector::ms_ptMouseDown(0.0,0.0); QPointF BaseSelector::ms_ptMouseLast(0.0,0.0); int BaseSelector::ms_nDragHandle = 0; BaseSelector::BaseSelector(QObject *parent) : QObject(parent) { m_type = ST_base; m_bHoverOnHandel = false; } BaseSelector::~BaseSelector() { } void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene) { if (event->button() != Qt::LeftButton) return; ms_ptMouseDown = event->scenePos(); ms_ptMouseLast = event->scenePos(); if(!m_bHoverOnHandel) scene->callParentEvent(event); //此处是通过触发QGraphicsScene的事件函数来取消所有被选中item的选中状态 ms_opMode = OM_none; GraphicsBaseItem* item = nullptr; QList items = scene->selectedItems(); if (items.count() == 1) //只有一个选中 { item = qgraphicsitem_cast(items.first()); if(item) { } } else if (items.count() > 1) //选中多个 { ms_opMode = OM_move; setCursor(scene, Qt::ClosedHandCursor); } if(ms_opMode == OM_none) { QGraphicsView *view = scene->getView(); if(view) view->setDragMode(QGraphicsView::RubberBandDrag); } } void BaseSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene) { ms_ptMouseLast = event->scenePos(); GraphicsBaseItem* item = nullptr; QList items = scene->selectedItems(); if (items.count() == 1) { item = qgraphicsitem_cast(items.first()); if(item) { if(ms_nDragHandle != H_none && ms_opMode == OM_scale) { QPointF basePoint = item->getSymmetricPointPos(ms_nDragHandle); if(basePoint.x() == 0) basePoint.setX(1); if(basePoint.y() == 0) basePoint.setY(1); //计算缩放倍数 QPointF iniDelta = item->mapFromScene(ms_ptMouseDown) - basePoint; QPointF lastDelta = item->mapFromScene(ms_ptMouseLast) - basePoint; double sx = lastDelta.x() / iniDelta.x(); double sy = lastDelta.y() / iniDelta.y(); item->resize(ms_nDragHandle, sx, sy, basePoint); } } } } void BaseSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene) { if (event->scenePos() == ms_ptMouseDown) ms_opMode = OM_none; setCursor(scene, Qt::ArrowCursor); GraphicsBaseItem* item = nullptr; QList items = scene->selectedItems(); if (items.count() == 1) { item = qgraphicsitem_cast(items.first()); if(item && (ms_opMode == OM_scale || ms_opMode == OM_edit) && ms_ptMouseLast != ms_ptMouseDown) { item->updateCoordinate(); } else if(item && ms_opMode == OM_move && ms_ptMouseLast != ms_ptMouseDown) { item->setPos(ms_ptMouseDown + (ms_ptMouseLast - ms_ptMouseDown)); } } if(ms_opMode == OM_none) { QGraphicsView *view = scene->getView(); if(view) view->setDragMode(QGraphicsView::NoDrag); } ms_opMode = OM_none; m_bHoverOnHandel = false; ms_nDragHandle = H_none; scene->callParentEvent(event); } void BaseSelector::setCursor(DesignerScene *scene, const QCursor &cursor) { QGraphicsView *view = scene->getView(); if (view) view->setCursor(cursor); }