1. 理解QPainter坐标系统基础
在Qt框架中进行图形绘制时,QPainter的坐标系统是开发者必须掌握的核心概念。与常见的数学坐标系不同,Qt的默认坐标系统原点(0,0)位于绘制设备的左上角,X轴向右延伸,Y轴向下延伸。这种设计源于计算机图形学的传统布局方式,与屏幕像素的排列方式保持一致。
当我们在QWidget的paintEvent中创建一个QPainter对象时,这个painter会自动关联到widget的坐标系。例如,在200x200像素的widget上,调用painter.drawPoint(100,100)会在正中心位置绘制一个点。这种坐标系统看似简单,但在实际开发中会遇到几个关键特性:
- 坐标值的单位默认是像素,但可以通过设置变换矩阵修改
- 子窗口和视口(viewport)会引入额外的坐标层次
- 反锯齿渲染时实际绘制位置可能会有亚像素偏移
重要提示:虽然Y轴向下增长不符合数学惯例,但在Qt中所有标准绘制函数(如drawLine、drawRect等)都遵循这个规则。试图通过修改坐标系方向来"纠正"这一点通常会导致后续开发混乱。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 坐标系转换的核心机制
2.1 基本变换操作
QPainter提供了四种基本的坐标变换方式,它们共同构成了强大的图形处理能力:
-
平移(translate):将坐标系原点移动到新位置
cpp复制painter.translate(100, 50); // 将原点移动到(100,50)平移是最常用的变换,特别适合实现相对定位。例如在绘制仪表盘时,可以先将原点移到中心点,然后基于此绘制刻度线和指针。
-
旋转(rotate):围绕当前原点旋转坐标系
cpp复制painter.rotate(45); // 顺时针旋转45度旋转操作默认以角度为单位,正数表示顺时针方向。旋转后所有后续绘制操作都会受到影响,包括绘制的文本。
-
缩放(scale):改变坐标系的单位尺寸
cpp复制painter.scale(2, 0.5); // X轴放大2倍,Y轴缩小一半缩放可以实现图形的放大缩小效果,但要注意这会同时影响线宽等属性。
-
切变(shear):使
