实现handle的光标样式随旋转角度做调整适配

This commit is contained in:
duanshengchao 2024-08-28 19:47:41 +08:00
parent 2cd9e236d5
commit 7f4c48d66f
2 changed files with 100 additions and 10 deletions

View File

@ -55,6 +55,8 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen
double dLengthY = ms_ptMouseLast.y() - originPoint.y(); double dLengthY = ms_ptMouseLast.y() - originPoint.y();
double dLengthX = ms_ptMouseLast.x() - originPoint.x(); double dLengthX = ms_ptMouseLast.x() - originPoint.x();
ms_dAngleMouseDownToItem = atan2(dLengthY, dLengthX) * 180 / M_PI; ms_dAngleMouseDownToItem = atan2(dLengthY, dLengthX) * 180 / M_PI;
// if(atan2(dLengthY, dLengthX) < 0)
// ms_dAngleMouseDownToItem += 360.0;
//创建副本 //创建副本
item->createOperationCopy(); item->createOperationCopy();
emit setWorkingSelector(ST_rotation); emit setWorkingSelector(ST_rotation);
@ -118,34 +120,115 @@ void BaseSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene
setCursor(scene, Qt::ArrowCursor); setCursor(scene, Qt::ArrowCursor);
m_bHoverOnHandel = false; m_bHoverOnHandel = false;
} }
else if(nHandle >= H_edit)
{
setCursor(scene, Qt::OpenHandCursor);
m_bHoverOnHandel = true;
}
else else
{ {
//划分为四组区间范围,分别水平组、垂直组、一三象限倾斜组、二四象限倾斜组,每组由两个对称区间构成
double dRotation = item->rotation();
double dTileAngle = 15.0;
switch (nHandle) switch (nHandle)
{ {
case H_leftTop: case H_leftTop:
setCursor(scene, Qt::SizeFDiagCursor); {
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
setCursor(scene, Qt::SizeBDiagCursor);
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
setCursor(scene, Qt::SizeHorCursor);
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
setCursor(scene, Qt::SizeVerCursor);
else //水平区间
setCursor(scene, Qt::SizeFDiagCursor);
break; break;
}
case H_top: case H_top:
setCursor(scene, Qt::SizeVerCursor); {
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
setCursor(scene, Qt::SizeHorCursor);
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
setCursor(scene, Qt::SizeFDiagCursor);
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
setCursor(scene, Qt::SizeBDiagCursor);
else
setCursor(scene, Qt::SizeVerCursor);
break; break;
}
case H_rightTop: case H_rightTop:
setCursor(scene, Qt::SizeBDiagCursor); {
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
setCursor(scene, Qt::SizeFDiagCursor);
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
setCursor(scene, Qt::SizeVerCursor);
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
setCursor(scene, Qt::SizeHorCursor);
else
setCursor(scene, Qt::SizeBDiagCursor);
break; break;
}
case H_right: case H_right:
setCursor(scene, Qt::SizeHorCursor); {
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
setCursor(scene, Qt::SizeVerCursor);
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
setCursor(scene, Qt::SizeBDiagCursor);
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
setCursor(scene, Qt::SizeFDiagCursor);
else
setCursor(scene, Qt::SizeHorCursor);
break; break;
}
case H_rightBottom: case H_rightBottom:
setCursor(scene, Qt::SizeFDiagCursor); {
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
setCursor(scene, Qt::SizeBDiagCursor);
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
setCursor(scene, Qt::SizeHorCursor);
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
setCursor(scene, Qt::SizeVerCursor);
else //水平区间
setCursor(scene, Qt::SizeFDiagCursor);
break; break;
}
case H_bottom: case H_bottom:
setCursor(scene, Qt::SizeVerCursor); {
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
setCursor(scene, Qt::SizeHorCursor);
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
setCursor(scene, Qt::SizeFDiagCursor);
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
setCursor(scene, Qt::SizeBDiagCursor);
else
setCursor(scene, Qt::SizeVerCursor);
break; break;
}
case H_leftBottom: case H_leftBottom:
setCursor(scene, Qt::SizeBDiagCursor); {
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
setCursor(scene, Qt::SizeFDiagCursor);
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
setCursor(scene, Qt::SizeVerCursor);
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
setCursor(scene, Qt::SizeHorCursor);
else //水平区间
setCursor(scene, Qt::SizeBDiagCursor);
break; break;
}
case H_left: case H_left:
setCursor(scene, Qt::SizeHorCursor); {
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
setCursor(scene, Qt::SizeVerCursor);
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
setCursor(scene, Qt::SizeBDiagCursor);
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
setCursor(scene, Qt::SizeFDiagCursor);
else
setCursor(scene, Qt::SizeHorCursor);
break; break;
}
case H_rotate_leftTop: case H_rotate_leftTop:
{ {
int nSize = 24; int nSize = 24;

View File

@ -32,14 +32,18 @@ void RotationSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerS
double dLengthY = ms_ptMouseLast.y() - originPoint.y(); double dLengthY = ms_ptMouseLast.y() - originPoint.y();
double dLengthX = ms_ptMouseLast.x() - originPoint.x(); double dLengthX = ms_ptMouseLast.x() - originPoint.x();
double dAngleMouseToItem = atan2(dLengthY, dLengthX) * 180 / M_PI; double dAngleMouseToItem = atan2(dLengthY, dLengthX) * 180 / M_PI;
// if(atan2(dLengthY, dLengthX) < 0)
// dAngleMouseToItem += 360.0;
double rotationAngle = item->rotation() + (dAngleMouseToItem - ms_dAngleMouseDownToItem); double rotationAngle = item->rotation() + (dAngleMouseToItem - ms_dAngleMouseDownToItem);
if (rotationAngle > 360) //让角度保持在正负180的区间也就是上下两个半圈这样易于象限判断
if (rotationAngle > 180)
rotationAngle -= 360; rotationAngle -= 360;
if (rotationAngle < -360) if (rotationAngle < -180)
rotationAngle += 360; rotationAngle += 360;
item->rotateOperationCopy(rotationAngle); item->rotateOperationCopy(rotationAngle);
//qDebug() << " rotationAngle:" << rotationAngle;
} }
} }
} }
@ -51,7 +55,10 @@ void RotationSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, Design
{ {
GraphicsBaseItem* item = qgraphicsitem_cast<GraphicsBaseItem*>(items.at(n)); GraphicsBaseItem* item = qgraphicsitem_cast<GraphicsBaseItem*>(items.at(n));
if(item) if(item)
{
item->removeOperationCopy(); item->removeOperationCopy();
}
} }
ms_nDragHandle = H_none; ms_nDragHandle = H_none;