实现handle的光标样式随旋转角度做调整适配
This commit is contained in:
parent
2cd9e236d5
commit
7f4c48d66f
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue