坐标系统
使用QPainter绘制时使用到逻辑坐标,然后转换成绘图设备的物理坐标。
逻辑坐标到物理坐标的映射由QPainter的worldTransform()函数、QPainter的viewport()函数以及window()函数进行处理。
worldTransform()函数 ------------------ 返回值为世界变换矩阵
viewport()函数 ------------------------- 返回值为视口矩形
window()函数 -------------------------- 返回值为窗口矩阵
视口(viewport)表示物理坐标下指定的一个任意矩阵,窗口(window)表示逻辑坐标下的同一个矩阵。这两个矩阵的四个角的坐标一一对应,利用QPainter绘制都是在逻辑坐标下绘图并对应到物理坐标下。
使用窗口-视口转换可以是逻辑坐标系统适合应用的要求,这个机制可以用来让绘图代码独立于绘图设备。
//以下代码可以让视口和窗口维持相同的宽高比来防止变形
int side = qMin(width(),height());
int x = (width() - side/);
int y = (height() - side/);
painter.setViewport(x,y,side,side);
常用的四种坐标系的变换:
- 平移 QTransform & translate(qreal dx, qreal dy)
- 旋转 QTransform & rotate(qreal angle, Qt::Axis axis = Qt::ZAxis)
- 缩放 QTransform & scale(qreal sx, qreal sy)
- 扭曲 QTransform & shear(qreal sh, qreal sv)
QPainter对象的保存:save()保存当前状态,restore()恢复上次save()的状态。