将绝对缩放比例应用于QGraphicsPixmapItems

时间:2018-07-20 05:08:38

标签: c++ qt qgraphicsview qgraphicsscene qgraphicsitem

当前我正在使用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

的完整代码

0 个答案:

没有答案