当前我正在使用QTransform
缩放项目,但是由于我的项目是通过鼠标调整大小的,因此当选择多个项目然后调整大小时,结果看起来很尴尬。所以我想用绝对缩放来缩放项目,但是似乎没有办法对所有项目应用绝对缩放,尽管对于QGraphicsRectItem
之类的某些项目,可以通过设置边角来完成。
这是我实现缩放的代码,不过我还没有触摸旋转。
void Transform::move(QGraphicsSceneMouseEvent *event)
{
_curPos = event->scenePos();
qreal dx = _curPos.x() - _prevPos.x();
qreal dy = _curPos.y() - _prevPos.y();
if (_mouseButton == Qt::LeftButton){
switch(_handle){
case TransformTool::BoundingRectItem::HotSpot::Move:{
foreach(QGraphicsItem *itm,_scene->selectedItems()) {
itm->moveBy(dx,dy);
}
break;
}
case TransformTool::BoundingRectItem::HotSpot::ScaleBottomRightCorner:{
_scalex += dx*0.002;
_scaley += dy*0.002;
for(int i=0;i<_curItems.length();i++){
_curState[i].scale(_scalex,_scaley);
_curItems[i]->setTransform(_curState[i],false);
}
break;
}
case TransformTool::BoundingRectItem::HotSpot::ScaleTopLeftCorner:{
_scalex -= dx*0.002;
_scaley -= dy*0.002;
for(int i=0;i<_curItems.length();i++){
_curState[i].scale(_scalex,_scaley);
_curItems[i]->setTransform(_curState[i],false);
_curItems[i]->moveBy(dx,dy);
}
break;
}
case TransformTool::BoundingRectItem::HotSpot::ScaleTopRightCorner:{
_scalex += dx*0.002;
_scaley -= dy*0.002;
for(int i=0;i<_curItems.length();i++){
_curState[i].scale(_scalex,_scaley);
_curItems[i]->setTransform(_curState[i],false);
_curItems[i]->moveBy(dx,dy);
}
break;
}
case TransformTool::BoundingRectItem::HotSpot::ScaleBottomLeftCorner:{
_scalex += dx*0.002;
_scaley -= dy*0.002;
for(int i=0;i<_curItems.length();i++){
_curState[i].scale(_scalex,_scaley);
_curItems[i]->setTransform(_curState[i],false);
_curItems[i]->moveBy(dx,dy);
}
break;
}
case TransformTool::BoundingRectItem::HotSpot::ScaleTopBoundary:{
_scaley -= dy*0.002;
for(int i=0;i<_curItems.length();i++){
_curState[i].scale(_scalex,_scaley);
_curItems[i]->setTransform(_curState[i],false);
_curItems[i]->moveBy(0,dy);
}
break;
}
case TransformTool::BoundingRectItem::HotSpot::ScaleBottomBoundary:{
_scaley += dy*0.002;
for(int i=0;i<_curItems.length();i++){
_curState[i].scale(_scalex,_scaley);
_curItems[i]->setTransform(_curState[i],false);
}
break;
}
case TransformTool::BoundingRectItem::HotSpot::ScaleLeftBoundary:{
_scalex -= dx*0.002;
for(int i=0;i<_curItems.length();i++){
_curState[i].scale(_scalex,_scaley);
_curItems[i]->setTransform(_curState[i],false);
_curItems[i]->moveBy(dx,0);
}
break;
}
case TransformTool::BoundingRectItem::HotSpot::ScaleRightBoundary:{
_scalex += dx*0.002;
for(int i=0;i<_curItems.length();i++){
_curState[i].scale(_scalex,_scaley);
_curItems[i]->setTransform(_curState[i],false);
}
break;
}
case TransformTool::BoundingRectItem::HotSpot::RotateBottomLeftCorner:{
break;
}
case TransformTool::BoundingRectItem::HotSpot::RotateBottomRightCorner:{
break;
}
case TransformTool::BoundingRectItem::HotSpot::RotateTopLeftCorner:{
break;
}
case TransformTool::BoundingRectItem::HotSpot::RotateTopRightCorner:{
break;
}
}
}
_scalex = 1;
_scaley = 1;
_prevPos = _curPos;
updateBounds();
}
这里_handle
是边界矩形周围的8个点之一(类似于photoshop的内容),_curItems
是所选项目的列表,_curState
是边界项的列表相应的变换。您可以找到程序here