#include "util/baseSelector.h" #include #include #include #include QPointF BaseSelector::ms_ptMouseDown(0.0,0.0); QPointF BaseSelector::ms_ptMouseLast(0.0,0.0); double BaseSelector::ms_dAngleMouseDownToItem = 0.0; int BaseSelector::ms_nDragHandle = 0; BaseSelector::BaseSelector(QObject *parent) : QObject(parent) { m_type = ST_base; m_opMode = OM_none; 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的选中状态 m_opMode = OM_none; QList items = scene->selectedItems(); if (items.count() == 1) //只有一个选中 { GraphicsBaseItem* item = qgraphicsitem_cast(items.first()); if(item) { //需要增加当前是否点击在控制点的判断函数 ms_nDragHandle = item->collidesWithHandle(event->scenePos()); if(ms_nDragHandle != H_none && ms_nDragHandle <= H_left) //在缩放控制点上 { m_opMode = OM_scale; emit setWorkingSelector(ST_scaling); } else if(ms_nDragHandle >= H_rotate_leftTop && ms_nDragHandle <= H_rotate_leftBottom) //在旋转控制点上 { m_opMode = OM_rotate; //计算夹角 QPointF originPoint = item->mapToScene(item->boundingRect().center()); double dLengthY = ms_ptMouseLast.y() - originPoint.y(); double dLengthX = ms_ptMouseLast.x() - originPoint.x(); ms_dAngleMouseDownToItem = atan2(dLengthY, dLengthX) * 180 / M_PI; //创建副本 item->createOperationCopy(); emit setWorkingSelector(ST_rotation); } else if(ms_nDragHandle > H_rotate_leftBottom) //编辑控制点上 { m_opMode = OM_edit; setCursor(scene, Qt::ClosedHandCursor); emit setWorkingSelector(ST_editing); } else { m_opMode = OM_move; setCursor(scene, Qt::ClosedHandCursor); emit setWorkingSelector(ST_moving); } } } else if (items.count() > 1) //选中多个 { m_opMode = OM_move; emit setWorkingSelector(ST_moving); setCursor(scene, Qt::ClosedHandCursor); } if(m_opMode == OM_move) //可以多个选中同时移动 { for(int n = 0; n < items.size(); n++) { //创建副本 GraphicsBaseItem* item = qgraphicsitem_cast(items.at(n)); item->createOperationCopy(); } } else if(m_opMode == OM_none) { QGraphicsView *view = scene->getView(); if(view) view->setDragMode(QGraphicsView::RubberBandDrag); } } void BaseSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene) { ms_ptMouseLast = event->scenePos(); QList items = scene->selectedItems(); if (items.count() == 1) { GraphicsBaseItem* item = qgraphicsitem_cast(items.first()); if(item) { if(ms_nDragHandle == H_none) { //设置光标样式 int nHandle = item->collidesWithHandle(event->scenePos()); if(nHandle == H_none) { setCursor(scene, Qt::ArrowCursor); m_bHoverOnHandel = false; } else { switch (nHandle) { case H_leftTop: setCursor(scene, Qt::SizeFDiagCursor); break; case H_top: setCursor(scene, Qt::SizeVerCursor); break; case H_rightTop: setCursor(scene, Qt::SizeBDiagCursor); break; case H_right: setCursor(scene, Qt::SizeHorCursor); break; case H_rightBottom: setCursor(scene, Qt::SizeFDiagCursor); break; case H_bottom: setCursor(scene, Qt::SizeVerCursor); break; case H_leftBottom: setCursor(scene, Qt::SizeBDiagCursor); break; case H_left: setCursor(scene, Qt::SizeHorCursor); break; case H_rotate_leftTop: { int nSize = 24; QCursor rotateCursor = QCursor(QPixmap(":/images/icon_rotate.png")/*.scaled(nSize, nSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)*/); setCursor(scene, rotateCursor); break; } case H_rotate_rightTop: { int nSize = 24; QCursor rotateCursor = QCursor(QPixmap(":/images/icon_rotate.png")/*.scaled(nSize, nSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)*/); setCursor(scene, rotateCursor); break; } case H_rotate_rightBottom: { int nSize = 24; QCursor rotateCursor = QCursor(QPixmap(":/images/icon_rotate.png")/*.scaled(nSize, nSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)*/); setCursor(scene, rotateCursor); break; } case H_rotate_leftBottom: { int nSize = 24; QCursor rotateCursor = QCursor(QPixmap(":/images/icon_rotate.png")/*.scaled(nSize, nSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)*/); setCursor(scene, rotateCursor); break; } default: break; } m_bHoverOnHandel = true; } } } } } void BaseSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene) { setCursor(scene, Qt::ArrowCursor); if(m_opMode == OM_none) { QGraphicsView *view = scene->getView(); if(view) view->setDragMode(QGraphicsView::NoDrag); } m_opMode = OM_none; m_bHoverOnHandel = false; ms_nDragHandle = H_none; scene->callParentEvent(event); } void BaseSelector::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene) { Q_UNUSED(event) Q_UNUSED(scene) } void BaseSelector::setCursor(DesignerScene *scene, const QCursor &cursor) { QGraphicsView *view = scene->getView(); if (view) view->setCursor(cursor); }