前言
开启序列五
正文
继续先看源码,下面是解释
首先看这两个#if #endif中的内容
1. 矩阵(Matrix)相关方法
过时的方法(Qt 5.13 之前使用)
-
void setMatrix(const QMatrix &matrix, bool combine = false);
- 设置绘图矩阵。
combine
参数指定是否将新矩阵与现有矩阵组合(默认为false
,即替换现有矩阵)。
- 设置绘图矩阵。
-
const QMatrix &matrix() const;
- 返回当前的绘图矩阵。
-
const QMatrix &deviceMatrix() const;
- 返回当前设备的矩阵。
-
void resetMatrix();
- 重置绘图矩阵为单位矩阵。
这些方法在 Qt 5.13 之后被标记为过时,推荐使用QT_DEPRECATED_X("Use xxx instead")
中的xxx函数来替代。
既然它们都已经被替代了,我们也就不看了,直接看这些新方法。
推荐使用的方法(Qt 5.13 及之后)
-
void setTransform(const QTransform &transform, bool combine = false);
- 设置绘图变换。
combine
参数指定是否将新变换与现有变换组合(默认为false
,即替换现有变换)。
- 设置绘图变换。
-
const QTransform &transform() const;
- 返回当前的绘图变换。
-
const QTransform &deviceTransform() const;
- 返回当前设备的变换。
-
void resetTransform();
- 重置绘图变换为单位变换。即恢复到没有变换的状态
-
void setWorldTransform(const QTransform &transform, bool combine = false);
- 设置世界变换。
combine
参数指定是否将新变换与现有变换组合(默认为false
,即替换现有变换)。
- 设置世界变换。
-
const QTransform &worldTransform() const;
- 返回当前的世界变换。
-
QTransform combinedTransform() const;
- 返回当前变换和世界变换的组合结果。
-
void setWorldMatrixEnabled(bool enabled);
- 启用或禁用世界变换。
-
bool worldMatrixEnabled() const;
- 返回是否启用了世界变换。
2. 变换(Transformations)
-
void scale(qreal sx, qreal sy);
- 按指定的比例因子
sx
和sy
缩放绘制内容。相当于绘制的图形的各点的(x,y),变成(x * sx,y * sy)
- 按指定的比例因子
-
void shear(qreal sh, qreal sv);
- 按指定的剪切因子
sh
和sv
剪切绘制内容。使其在某个方向上“倾斜”或“拉伸”,而不是简单地缩放或旋转。
- 按指定的剪切因子
-
void rotate(qreal a);
- 按指定的角度
a
旋转绘制内容。大于0逆时针,小于0顺时针
- 按指定的角度
-
void translate(const QPointF &offset);
- 按指定的
QPointF
偏移量offset
平移绘制内容。
- 按指定的
-
inline void translate(const QPoint &offset);
- 按指定的
QPoint
偏移量offset
平移绘制内容。
- 按指定的
-
inline void translate(qreal dx, qreal dy);
- 按指定的
dx
和dy
偏移量平移绘制内容。相当于绘制的图形的各点的(x,y),变成(x + dx,y + dy)
- 按指定的
四种变换
1. 绘图变换(Painter Transform)
定义: 绘图变换是应用于 QPainter
的变换,它影响所有通过 QPainter
绘制的内容。绘图变换通常包括平移、缩放、旋转和剪切操作。
用途:
- 局部变换:例如,在一个小区域内缩放或旋转图形。
- 局部调整:改变图形的大小、位置或角度。
示例:
QPainter painter;
QTransform transform;
transform.translate(50, 50); // 平移 50 像素
painter.setTransform(transform); // 应用变换
painter.drawRect(10, 10, 100, 100); // 绘制图形
2. 设备变换(Device Transform)
定义: 设备变换指的是与绘图设备(如窗口、图片等)相关的变换。这种变换通常是由绘图设备本身的属性或设置决定的,例如 DPI(每英寸点数)或其他设备特定的设置。
用途:
- 设备适配:处理不同设备的显示特性,使图形在各种设备上显示一致。
- 设备属性:确保绘图内容适应设备的实际显示特性。
示例:
QPainter painter;
QTransform deviceTransform = painter.deviceTransform(); // 获取设备变换
3. 单位变换(Identity Transform)
定义: 单位变换是指没有任何变换效果的变换,即绘图内容以其原始状态显示。这种变换也称为
单位矩阵变换,代表不进行任何变换。
用途:
- 重置变换:当需要返回到没有变换的状态时使用。
- 基本状态:用于清楚的绘图基线,以确保没有变换影响绘制结果。
示例:
QPainter painter;
painter.resetTransform(); // 重置变换为单位变换
painter.drawRect(10, 10, 100, 100); // 绘制图形
4. 世界变换(World Transform)
定义: 世界变换是应用于整个绘图场景的变换。它影响 QPainter
绘制的所有内容,与绘图变换类似,但通常用于设置更大的绘图范围的变换。它影响整个绘图设备的全局坐标系。
用途:
- 全局变换:应用于整个场景,而不仅仅是单个绘图操作。
- 全局调整:实现全局的旋转、缩放或其他变换效果。
示例:
QPainter painter;
QTransform worldTransform;
worldTransform.rotate(45); // 旋转 45 度
painter.setWorldTransform(worldTransform); // 设置世界变换
painter.drawEllipse(10, 10, 100, 100); // 绘制图形
关于Transform类
这个类就是一个矩阵类,用于表示二位空间中的线性变换。学过线代的应该都知道矩阵是啥了,如果忘记了,可以看完我以前的一篇博客线性代数之矩阵
示例一:
"变换"用于在图形绘制中改变绘制内容的位置、方向和大小。它们是图形变换操作的基础
void PaintWidget::paintEvent(QPaintEvent* event)
{
Q_UNUSED(event);
QPainter painter(this);
QPen pen;
QTransform transform;
// 右平移 100 像素
transform.translate(100, 0);
pen.setColor(Qt::green);
painter.setPen(pen);
// 设置变换,替换现有变换
painter.setTransform(transform);
// 绘制一个矩形
painter.drawRect(200, 50, 100, 100);
// 左边平移 100 像素
pen.setColor(Qt::red);
painter.setPen(pen);
transform.translate(-200,-10);
painter.setTransform(transform);
painter.drawRect(200, 50, 100, 100);
//translate,x正右,负左;y正下,负上
}
示例二:
void PaintWidget::paintEvent(QPaintEvent* event)
{
Q_UNUSED(event);
QPainter painter(this);
QPen pen;
pen.setColor(Qt::red);
painter.setPen(pen);
QTransform transform;
//向右,向下皆平移50像素
transform.translate(50,50);
//旋转45°
transform.rotate(45);
//应用变换
painter.setTransform(transform);
//画个矩形
painter.drawRect(10,10,80,80);
//获取当前变换
QTransform currentTransform = painter.transform();
QTransform transform2;
//整个图形缩小一倍
transform2.scale(0.5,0.5);
// 组合变换
QTransform combinedTransform = transform2 * currentTransform;
// 应用组合后的变换
painter.setTransform(combinedTransform);
//画个矩形
painter.drawRect(10,10,80,80);
// 水平剪切
painter.shear(0.5,0);
painter.drawRect(300, 100, 100, 100);
// 重置变换
painter.resetTransform();
painter.drawRect(10,10,80,80);
}