QT 范例阅读: 绘图设备转换 transformation

一、标签:transformation 

        效果图:绘图设备的原始坐标零点是左上角

        QT 范例阅读: 绘图设备转换 transformation_第1张图片

主要代码

    //创建时钟图形的绘图路径
    //这里的坐标是原始坐标,也就是在不经过任何转换的情况下显示,只能显示1/4 个圆
    QPainterPath clock;
    clock.addEllipse(-50.0, -50.0, 100.0, 100.0);
    clock.addEllipse(-48.0, -48.0, 96.0, 96.0);
    clock.moveTo(0.0, 0.0);
    clock.lineTo(-2.0, -2.0);
    clock.lineTo(0.0, -42.0);
    clock.lineTo(2.0, -2.0);
    clock.lineTo(0.0, 0.0);
    clock.moveTo(0.0, 0.0);
    clock.lineTo(2.732, -0.732);
    clock.lineTo(24.495, 14.142);
    clock.lineTo(0.732, 2.732);
    clock.lineTo(0.0, 0.0);

//绘制  
void RenderArea::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.fillRect(event->rect(), QBrush(Qt::white));//绘制背景

    painter.translate(66, 66); //先把坐标逻辑0点平移到(60,60)


    painter.save(); //保存状态
    
    //转换:更新传入的转换类型,依次转换;如最后一个图是经过 平移、旋转、缩放 三次转换后生成
    for (int i = 0; i < operations.size(); ++i) {
        switch (operations[i]) {
        case Translate:
            //平移到(50,50);注意,在此之前逻辑原点已经平移到60,60了,这里再平移是对于逻辑原点来说的,,也就是在最初的坐标系上来看,现在原点在(110,110)位置
            painter.translate(50, 50); 
            break;
        case Scale:
            painter.scale(0.75, 0.75); //缩小
            break;
        case Rotate:
            painter.rotate(60); //旋转60度
            break;
        case NoTransformation:
        default:
            ;
        }
    }


    drawShape(painter); //绘制图形
    painter.restore(); //恢复绘图设备(原点变回(60,60)了)


    drawOutline(painter); //画正方形框线

    transformPainter(painter); //再次变换
    drawCoordinates(painter); //画红色指针
}

你可能感兴趣的:(QT,qt)