• 物理坐标:QPainter绘图时,默认的起始坐标为应用程序的左上角,这叫做绘图设备的物理坐标
  • 逻辑坐标:QPainter提供了一些坐标变换的功能,通过平移、旋转等坐标转换,得到的坐标称为“逻辑坐标”

坐标原点:当图形移动之后,坐标原点会随着动态变化,见下面的各个案例

一、QPainter坐标转换函数

Qt:47---QPainter绘图之坐标转换函数、视口和窗口_坐标转换

  • 备注:常用的坐标变换是平移、旋转、缩放,使用世界坐标变换矩阵也可以实现这些变换功能,但是需要单独定义一个QTransform类的变量,对于QPainter来说,上面这些函数就足够使用了

坐标平移(translate函数)

Qt:47---QPainter绘图之坐标转换函数、视口和窗口_逻辑坐标_02

  • 功能:表示将坐标系统水平方向平移dx个单位,垂直方向平移dy个单位(在缺省的坐标系统中,单位就是像素)
  • 如果是从原始状态平移(dx,dy),那么平移后的坐标原点就移动了(dx,dy)
  • 例如:假设一个绘图窗口宽度为300像素,高度为200像素,则其原始坐标系统如左图所示。若执行translate(150,100),平移后的坐标系统如右图所示,坐标原点此时移动到窗口的中心,而左上角的坐标变为(-150,-100)

Qt:47---QPainter绘图之坐标转换函数、视口和窗口_坐标转换_03

坐标旋转(rotate函数)

Qt:47---QPainter绘图之坐标转换函数、视口和窗口_坐标系统_04

  • 功能:它将坐标系统绕坐标原点顺时针旋转angle角度,单位是度
  • 当angle为正数时表示顺时针旋转;当angle为负数时表示逆时针旋转
  • 例如:将图8-10中的右图旋转90度(rotate(90)),得到下图

Qt:47---QPainter绘图之坐标转换函数、视口和窗口_坐标转换函数、视图和窗口_05

缩放(scale函数)

Qt:47---QPainter绘图之坐标转换函数、视口和窗口_坐标转换函数、视图和窗口_06

  • 参数:sx、sy分别为横向和纵向缩放比例
  • 比例大于1是放大;比例小于1是缩小

状态保存与恢复(save、restore、resetTransform)

进行坐标变换时,QPainter内部实际上有一个坐标变换矩阵

  • save():保存当前坐标状态
  • restore():恢复上次保存的坐标状态

save函数与restore函数必须配对使用,操作的是一个堆栈对象

  • resetTransform():则是复位所有坐标变换操作,恢复原始的坐标系统

坐标转换演示案例:

二、视口和窗口

视口:

  • 视口表示绘图设备的任意一个矩形区域的物理坐标,可以只选取物理坐标的一个矩形区域用于绘图
  • QPainter绘图的范围就是视口的范围,不能超出视口的范围进行绘图
  • 默认情况下,视口的大小等于绘图设备的整个矩形区

窗口:

  • 与视口一样,也是一个矩形,不过是用逻辑坐标定义的坐标系。窗口可以直接定义矩形区的逻辑坐标范围

应用程序窗体变化,视口和窗口显示的图形会随着动态适应变化

setViewport()函数

  • 用于设置此次QPainter绘图的视口
  • 参数1、2:代表视口的起点(左上角)坐标。参数3、4:分别代表视口的宽度和高度

Qt:47---QPainter绘图之坐标转换函数、视口和窗口_逻辑坐标_07

  • 参数:以一个QRect变量为参数

Qt:47---QPainter绘图之坐标转换函数、视口和窗口_坐标系统_08

setWindow()函数

  • 用于设置窗口
  • 参数1、2:针对于视口的起点(左上角)坐标。参数3、4:分别代表窗口的宽度和高度

Qt:47---QPainter绘图之坐标转换函数、视口和窗口_坐标转换_09

  • 参数:以一个QRect变量为参数

Qt:47---QPainter绘图之坐标转换函数、视口和窗口_逻辑坐标_10

图解:

假设矩形框的宽度为300像素,高度为200像素

Qt:47---QPainter绘图之坐标转换函数、视口和窗口_逻辑坐标_11

  • 视口:a中的灰色区域就是我们设置的视口,视口的左上角坐标为(50,0),右下角下标为(250,200)。定义的语句为painter.setViewport(50,0,200,200)

  • 窗口:针对于上面定义的视口,我们定义了一个窗口(b),窗口坐标的中心在矩形的中心,并设置正方形的逻辑边长为100。窗口的左上角坐标为(-50,-50),窗口宽度为100,定义的语句为painter.setWindow(-50,-50,100,100)

演示案例: