QT 范例阅读: 绘图设备转换 transformation
一、标签:transformation
效果图:绘图设备的原始坐标零点是左上角

主要代码
//创建时钟图形的绘图路径//这里的坐标是原始坐标,也就是在不经过任何转换的情况下显示,只能显示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); //画红色指针
}