物理坐标系与逻辑坐标系
绘图设备的物理坐标系是基本的坐标系,通过 QPainter 的平移、旋转等坐标变换可以得到更容
易操作的逻辑坐标系。
物理坐标系也称为视口(viewport)坐标系,逻辑坐标系也称为窗口( window)
坐标系,通过内部的坐标变换矩阵, QPainter 能自动将逻辑坐标变换为绘图设备的物理坐标。
视口
视口是指绘图设备的任意一个矩形区域,它使用物理坐标系。我们可以只选取物理坐标系中的一
个矩形区域来绘图,默认情况下,视口等于绘图设备的整个矩形区域。
定义视口
cpp
painter.setViewport(50,0,200,200);
窗口
窗口与视口是同一个矩形区域,但是窗口是用逻辑坐标系定义的,窗口可以直接定义矩形区域的逻辑坐标范围。
cpp
void QPainter::setWindow(int x, int y, int width, int height)
painter.setWindow(-50,-50,100,100);
视口和窗口使用例子
初始化
cpp
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
int W= this->width();
int H = this->height();
int side = qMin(W,H);
定义视口矩形
取长和宽的最小值,作为正方形的边长
cpp
QRect rect((W-side)/2,(H-side)/2,side,side);
painter.drawRect(rect);//绘制一个矩形
painter.setViewport(rect);//设置为视口
设置窗口的坐标系
cpp
painter.setWindow(-100,-100,200,200);//设置窗口的坐标系
设置画笔
cpp
QPen pen;
pen.setWidth(1);
pen.setColor(Qt::red);
pen.setStyle(Qt::SolidLine);
pen.setCapStyle(Qt::FlatCap);//线端点样式
pen.setJoinStyle(Qt::BevelJoin);//线的连接点样式
painter.setPen(pen);
使用窗口坐标系作图
画圆,每10°,通过坐标系的旋转画一个圆,画24个
cpp
for(int i=0;i<24;i++)
{
painter.drawEllipse(QPoint(50,0),50,50);
painter.rotate(10);
}
结果
总结
- 设置了窗口坐标系,按照窗口坐标系作图
2.当窗口的宽度大于高度时,以高度为正方形边长,当高度大于宽度时,以宽度为正方形边长,且图形是自动缩放的。
3.首先定义了一个正方形视口,正方形以绘图设备的长、宽中的较小者为边长。然后定义了窗口,定义的窗口是中心在原点,边长为 200 像素的正方形。