QT坐标变换——视图缩放、翻转、平移

视图的缩放:

对视图进行缩放,主要是重写wheelEvent事件

void Myview::wheelEvent(QWheelEvent *event)//重写滚轮事件
{
    qreal factor_out = transform().scale(1.2, 1.2).mapRect(QRectF(0,0,1,1)).width();
    qreal factor_in=transform().scale(1/1.2,1/1.2).mapRect(QRectF(0,0,1,1)).width();
    if(event->delta()>0){
        if(factor_out>70) return;//防止视图过大
        scale(1.2,1.2);//放大
    }
    else if(event->delta()<0){
        if(factor_in<0.1)return;//防止视图过小
        scale(1/1.2,1/1.2);//缩小
    }
}
为了改善缩放效果,以鼠标为中心进行缩放,则需要添加以下代码:
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);

 

视图的平移:

实现视图的平移要比缩放复杂一些,需要重写三个鼠标事件:mousePressEvent、mouseMoveEvent、mouseReleaseEvent。

大概过程如下:(1)按下:鼠标左键->改变光标、触发平移信号(bool值为真)->记录鼠标按下的初始坐标

              (2)移动:接收到平移信号->计算移动距离->记录鼠标最后的坐标(作为下一次平移的起点坐标)

              (3)释放:恢复之前平移信号和光标形状

void Myview::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == translateButton) {
        //若按下左键
        QCursor cursor1;//创建光标对象
        cursor1.setShape(Qt::OpenHandCursor);//设置光标形态为手掌
        setCursor(cursor1); //使用手掌光标
        //qDebug()<<mapToScene(event->pos());
        sign = true;//触发平移信号
        lastPos = event->pos();
    }
    QGraphicsView::mousePressEvent(event);
}
void Myview::mouseMoveEvent(QMouseEvent *event)
{
    if (sign==true){
        QPointF mouseDelta = event->pos() - lastPos;
        translate(mouseDelta);
    }
    lastPos = event->pos();
    QGraphicsView::mouseMoveEvent(event);
}
void Myview::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == translateButton)
        sign = false;
    setCursor(cursor); //拖动完成后,光标恢复默认形状
    QGraphicsView::mouseReleaseEvent(event);
}
// 平移
void Myview::translate(QPointF delta)
{
    delta *= translateSpeed;
    // view 根据鼠标下的点作为锚点来定位 scene
    setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
    QPoint newCenter(VIEW_WIDTH/2-delta.x(),VIEW_HEIGHT/2-delta.y());
    centerOn(mapToScene(newCenter));
    // scene 在 view 的中心点作为锚点
    setTransformationAnchor(QGraphicsView::AnchorViewCenter);
}

 

视图的翻转(Y轴):

之前写的代码是对图元的翻转,其本身坐标发生了改变,为了改善这个问题,可以对整个视图进行翻转,从而保证图元坐标不发生变化。

QTransform transform;
transform.rotate(180,Qt::XAxis);//视图绕x轴旋转180度
view->setTransform(transform);

 

posted @ 2018-11-19 10:41  Ivy-y  阅读(4265)  评论(1编辑  收藏  举报