Qt:玩转QPainter序列五(变换)

前言

开启序列五

正文

继续先看源码,下面是解释
在这里插入图片描述
首先看这两个#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);

    • 按指定的比例因子 sxsy 缩放绘制内容。相当于绘制的图形的各点的(x,y),变成(x * sx,y * sy)
  • void shear(qreal sh, qreal sv);

    • 按指定的剪切因子 shsv 剪切绘制内容。使其在某个方向上“倾斜”或“拉伸”,而不是简单地缩放或旋转。
  • 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);

    • 按指定的 dxdy 偏移量平移绘制内容。相当于绘制的图形的各点的(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);


}

在这里插入图片描述

  • 30
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值