QTransform#

QTransform 类指定了坐标系的 2D 变换。更多信息

概要#

方法#

静态函数#

注意

此文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎为代码片段翻译做出贡献。如果您发现翻译中存在问题,您也可以通过在https:/bugreports.qt.io/projects/PYSIDE创建票证来告诉我们

详细描述#

警告

本节包含从C++自动翻译到Python的代码片段,可能存在错误。

变换指定如何平移、缩放、剪切、旋转或投射坐标系,通常用于渲染图形。

可以使用QTransform 对象通过setMatrix() , scale() , rotate() , translate()shear() 函数来构建。或者,它也可以通过应用基础矩阵操作来构建。矩阵也可以在构建时定义,并且可以使用reset() 函数将其重置为单位矩阵(默认值)。

QTransform 类支持图形原语的映射:给定的点、线、多边形、区域或绘图路径都可以通过使用 map() 函数映射到由 矩阵定义的坐标系。对于矩形,其坐标可以被 mapRect() 函数转换。矩形还可以使用 mapToPolygon() 函数转换为多边形(映射到由 矩阵定义的坐标系)。

QTransform 提供了 isIdentity() 函数,如果矩阵是单位矩阵则返回 true,以及 isInvertible() 函数,如果矩阵是非奇异(即 AB = BA = I)则返回 true。函数 inverted() 在矩阵可逆时返回该矩阵的逆矩阵的副本(否则返回单位矩阵),函数 adjoint() 返回矩阵的经典伴随矩阵。此外,QTransform 提供了 determinant() 函数,返回矩阵的行列式。

最后,QTransform 类支持矩阵乘法、加法和减法,并且该类的对象可以进行流处理和比较。

渲染图形#

在渲染图形时,矩阵定义了转换,但实际的转换是由 QPainter 中的绘图例程完成的。

默认情况下,QPainter 在关联设备的坐标系上操作。一个 QPaintDevice 的标准坐标系其原点位于右上角。x 值向右递增;y 值向下递增。有关完整说明,请参阅坐标系文档。

QPainter 提供了在不需要使用 QTransform 的情况下,平移、缩放、切变和旋转坐标系统的功能。例如

qtransform-simpletransformation1

def paintEvent(self, arg__0):

    painter = QPainter(self)
    painter.setPen(QPen(Qt.blue, 1, Qt.DashLine))
    painter.drawRect(0, 0, 100, 100)
    painter.rotate(45)
    painter.setFont(QFont("Helvetica", 24))
    painter.setPen(QPen(Qt.black, 1))
    painter.drawText(20, 10, "QTransform")

虽然这些函数非常方便,但如果要执行多个变换操作,构建一个 QTransform 并调用 setTransform() 可能会更高效。例如

qtransform-combinedtransformation2

def paintEvent(self, arg__0):

    painter = QPainter(self)
    painter.setPen(QPen(Qt.blue, 1, Qt.DashLine))
    painter.drawRect(0, 0, 100, 100)
    transform = QTransform()
    transform.translate(50, 50)
    transform.rotate(45)
    transform.scale(0.5, 1.0)
    painter.setTransform(transform)
    painter.setFont(QFont("Helvetica", 24))
    painter.setPen(QPen(Qt.black, 1))
    painter.drawText(20, 10, "QTransform")

基本矩阵运算#

../../_images/qtransform-representation.png

QTransform 实例包含一个 3x3 矩阵。元素 m31 (dx) 和 m32 (dy) 指定了水平和垂直平移。元素 m11m22 指定了水平和垂直缩放。元素 m21m12 指定了水平和垂直的 切变。最后,元素 m13m23 指定了水平和垂直的投影,其中 m33 是额外的投影因子。

QTransform 使用以下公式将平面上的一个点转换到另一个点

x' = m11x + m21y + dx
y' = m22y + m12x + dy
if not isAffine():
    w' = m13x + m23y + m33
    x' /= w'
    y' /= w'

(x, y) 是原始点,而 (x’, y’) 是变换后的点。通过在 inverted() 矩阵上执行相同的操作,(x’, y’) 可以转换回 (x, y)

在构建矩阵时可以设置各种矩阵元素,或者在稍后使用 setMatrix() 函数来设置。可以使用 translate()rotate()scale()shear() 方便函数对这些元素进行操作。可以借助 m11()m12()m13()m21()m22()m23()m31()m32()m33()dx()dy() 函数来检索当前设置的值。

平移是最简单的变换。设置 dxdy 将会沿着 X 轴将坐标系移动 dx 个单位,并且沿着 Y 轴移动 dy 个单位。通过设置 m11m22 来执行缩放。例如,将 m11 设置为 2 并且将 m22 设置为 1.5 将使高度加倍并且宽度增加 50%。单位矩阵将 m11m22m33 设置为 1(其他所有设置为 0),将一个点映射为自身。剪切由 m12m21 控制。将这些元素设置为非零值将会扭曲坐标系。通过设置剪切因子和缩放因子来实现旋转。透视变换是通过对投影因子和缩放因子的设置来实现的。

变换的组合#

以下是一个使用基本矩阵运算的组合变换示例:

qtransform-combinedtransformation23

def paintEvent(self, arg__0):

    a = qDegreesToRadians(45.0)
    sina = sin(a)
    cosa = cos(a)
    scale = QTransform(0.5, 0, 0, 1.0, 0, 0)
    rotate = QTransform(cosa, sina, -sina, cosa, 0, 0)
    translate = QTransform(1, 0, 0, 1, 50.0, 50.0)
    transform = scale * rotate * translate
    painter = QPainter(self)
    painter.setPen(QPen(Qt.blue, 1, Qt.DashLine))
    painter.drawRect(0, 0, 100, 100)
    painter.setTransform(transform)
    painter.setFont(QFont("Helvetica", 24))
    painter.setPen(QPen(Qt.black, 1))
    painter.drawText(20, 10, "QTransform")

组合变换首先对每个操作数进行缩放,然后旋转,最后平移,顺序与因子乘积的书写顺序相同。这意味着应用变换的点隐含地乘以右侧的变换。

与矩阵表示的关系#

QTransform中使用的矩阵表示法是常见教学惯例的转置,该惯例将变换和点表示为矩阵和向量。该惯例将其矩阵乘以左侧和右侧的列向量。换句话说,当多个变换应用于一个点时,最右侧的矩阵首先直接作用于向量。然后,左侧的下一个矩阵作用于第一次操作的结果,依此类推。因此,该惯例以与QTransform中相反的顺序乘以组成复合变换的矩阵。正如您在Combining Transforms中看到的,将矩阵转置并结合到表示点的行向量右侧,可以让变换矩阵的乘积以我们应对点应用变换的顺序出现。

另请参阅

QPainter 坐标系统 仿射变换 ExampleTransformations Example

class TransformationType#

常量

描述

QTransform.TxNone

QTransform.TxTranslate

QTransform.TxScale

QTransform.TxRotate

QTransform.TxShear

QTransform.TxProject

__init__(other)#
参数:

otherQTransform

__init__()

构建一个单位矩阵。

所有元素都被设置为零,除了m11m22(指定缩放)和m33,它们被设置为1。

另请参阅

reset()

__init__(h11, h12, h21, h22, dx, dy)
参数:
  • h11 – float

  • h12 – float

  • h21 – float

  • h22 – float

  • dx – float

  • dy – float

使用元素 m11m12m21m22dxdy 构建一个矩阵。

另请参阅

setMatrix()

__init__(h11, h12, h13, h21, h22, h23, h31, h32, h33)
参数:
  • h11 – float

  • h12 – float

  • h13 – float

  • h21 – float

  • h22 – float

  • h23 – float

  • h31 – float

  • h32 – float

  • h33 – float

使用元素 m11m12m13m21m22m23m31m32m33 构建一个矩阵。

另请参阅

setMatrix()

__reduce__()#
返回类型:

object

__repr__()#
返回类型:

object

adjoint()#
返回类型:

QTransform

返回此矩阵的伴随。

determinant()#
返回类型:

float

返回矩阵的行列式。

dx()#
返回类型:

float

返回水平平移因子。

另请参阅

m31() translate() 基本矩阵操作

dy()#
返回类型:

float

返回垂直平移因子。

另请参阅

translate() 基本矩阵操作

静态fromScale(dx, dy)#
参数:
  • dx – float

  • dy – float

返回类型:

QTransform

创建一个矩阵,其水平缩放与 sx 相对应,垂直缩放与 sy 相对应。这与 QTransform() .scale(sx, sy) 相同,但速度略快。

静态 fromTranslate(dx, dy)#
参数:
  • dx – float

  • dy – float

返回类型:

QTransform

创建一个矩阵,其对应于沿 x 轴的平移量为 dx 和沿 y 轴的平移量为 dy。这与 QTransform() .translate(dx, dy) 相同,但速度略快。

inverted()#
返回类型:

PyTuple

返回该矩阵的逆矩阵副本。

如果矩阵是奇异的(不可逆),返回的矩阵是单位矩阵。如果 invertible 有效(即不等于 0),其值设置为真,如果矩阵是可逆的,否则设置为假。

另请参阅

isInvertible()

isAffine()#
返回类型:

bool

如果矩阵表示仿射变换,则返回 true,否则返回 false

isIdentity()#
返回类型:

bool

如果矩阵是单位矩阵,则返回 true,否则返回 false

另请参阅

reset()

isInvertible()#
返回类型:

bool

如果矩阵是可逆的,则返回 true,否则返回 false

另请参阅

inverted()

isRotating()#
返回类型:

bool

如果矩阵表示某种旋转变换,则返回 true,否则返回 false

注意

180 度和/或 360 度的旋转变换被视为缩放变换。

另请参阅

reset()

isScaling()#
返回类型:

bool

如果矩阵表示缩放变换,则返回 true,否则返回 false

另请参阅

reset()

isTranslating()#
返回类型:

bool

如果矩阵表示平移变换,则返回 true,否则返回 false

另请参阅

reset()

m11()#
返回类型:

float

返回水平缩放因子。

另请参阅

scale() 基本 矩阵 操作

m12()#
返回类型:

float

返回垂直剪切因子。

另请参阅

shear() 基本 矩阵 操作

m13()#
返回类型:

float

返回水平投影因子。

另请参阅

translate() 基本矩阵操作

m21()#
返回类型:

float

返回水平剪切因子。

另请参阅

shear() 基本 矩阵 操作

m22()#
返回类型:

float

返回垂直缩放因子。

另请参阅

scale() 基本 矩阵 操作

m23()#
返回类型:

float

返回垂直投影因子。

另请参阅

translate() 基本矩阵操作

m31()#
返回类型:

float

返回水平平移因子。

另请参阅

dx() translate() 基本 矩阵 操作

m32()#
返回类型:

float

返回垂直平移因子。

另请参阅

dy() translate() 基本 矩阵 操作

m33()#
返回类型:

float

返回除法因子。

另请参阅

translate() 基本矩阵操作

map(x, y)#
参数:
  • x – float

  • y – float

返回类型:

PyObject

警告

本节包含从C++自动翻译到Python的代码片段,可能存在错误。

将给定的坐标 xy 映射到由该矩阵定义的坐标系中。结果值分别放入 *``tx`` 和 *``ty`` 中。

坐标变换使用以下公式

x' = m11x + m21y + dx
y' = m22y + m12x + dy
if not isAffine():
    w' = m13x + m23y + m33
    x' /= w'
    y' /= w'

点 (x, y) 是原始点,而 (x’,y’)则是变换后的点。

另请参阅

基本矩阵操作

map(r)
参数:

rQRegion

返回类型:

QRegion

这是一个重载函数。

创建并返回一个QRegion对象,它是给定区域region的一个副本,并映射到由此矩阵定义的坐标系统。

如果使用旋转或剪切,调用此方法可能会相对昂贵。

map(a)
参数:

aQPolygonF

返回类型:

QPolygonF

这是一个重载函数。

创建并返回一个QPolygonF对象,它是给定多边形polygon的一个副本,并映射到由此矩阵定义的坐标系统。

map(a)
参数:

aQPolygon

返回类型:

QPolygon

这是一个重载函数。

创建并返回一个QPolygon对象,它是给定多边形polygon的一个副本,并映射到由此矩阵定义的坐标系统。注意,转换后的坐标被四舍五入到最接近的整数。

map(p)
参数:

pQPoint

返回类型:

QPoint

这是一个重载函数。

创建并返回一个QPoint对象,它是给定点point的副本,并将其映射到由此矩阵定义的坐标系统。注意,转换后的坐标被四舍五入到最接近的整数。

map(p)
参数:

pQPointF

返回类型:

QPointF

这是一个重载函数。

创建并返回一个QPointF对象,它是给定点,p的副本,将其映射到由此矩阵定义的坐标系统。

map(l)
参数:

lQLine

返回类型:

QLine

这是一个重载函数。

创建并返回一个QLineF对象,它是对给定线l的一个副本,并映射到由此矩阵定义的坐标系统。

map(l)
参数:

lQLineF

返回类型:

QLineF

这是一个重载函数。

创建并返回一个QLine对象,它是对给定line的一个副本,并映射到由此矩阵定义的坐标系统。注意,转换后的坐标被四舍五入到最接近的整数。

map(p)
参数:

pQPainterPath

返回类型:

QPainterPath

这是一个重载函数。

创建并返回一个 QPainterPath 对象,它是给定 path 的副本,并映射到由该矩阵定义的坐标系中。

mapRect(arg__1)#
参数:

arg__1QRect

返回类型:

QRect

这是一个重载函数。

创建并返回一个 QRect 对象,它是给定 rectangle 的副本,并映射到由该车矩阵定义的坐标系中。请注意,转换后的坐标将四舍五入到最接近的整数。

mapRect(arg__1)
参数:

arg__1QRectF

返回类型:

QRectF

警告

本节包含从C++自动翻译到Python的代码片段,可能存在错误。

创建并返回一个 QRectF 对象,它是给定 rectangle 的副本,并将其映射到由该车矩阵定义的坐标系中。

矩形的坐标使用以下公式进行转换

x' = m11x + m21y + dx
y' = m22y + m12x + dy
if not isAffine():
    w' = m13x + m23y + m33
    x' /= w'
    y' /= w'

如果指定了旋转或剪切,则此函数返回 包围盒 矩形。要检索给定 rectangle 映射的确切区域,请使用 mapToPolygon() 函数。

另请参阅

mapToPolygon() Basic Matrix Operations

mapToPolygon(r)#
参数:

rQRect

返回类型:

QPolygon

警告

本节包含从C++自动翻译到Python的代码片段,可能存在错误。

创建并返回一个 QPolygon 的表示,该表示反映了给定的 rectangle,并映射到由该车矩阵定义的坐标系中。

矩形的坐标使用以下公式进行转换

x' = m11x + m21y + dx
y' = m22y + m12x + dy
if not isAffine():
    w' = m13x + m23y + m33
    x' /= w'
    y' /= w'

多边形和矩形在转换时的行为略有不同(因为整数四舍五入),所以 matrix.map(QPolygon(rectangle)) 不一定与 matrix.mapToPolygon(rectangle) 相同。

另请参阅

mapRect() Basic Matrix Operations

__ne__(arg__1)#
参数:

arg__1QTransform

返回类型:

bool

如果此矩阵不等于给定的 matrix,则返回 true,否则返回 false

__mul__(o)#
参数:

oQTransform

返回类型:

QTransform

返回将此矩阵与给定 矩阵 相乘的结果。

请注意,矩阵乘法不是交换的,即 a*b != b*a。

__mul__(n)
参数:

n – float

返回类型:

QTransform

__imul__(arg__1)#
参数:

arg__1QTransform

返回类型:

QTransform

这是一个重载函数。

返回将此矩阵与给定 矩阵 相乘的结果。

__imul__(div)
参数:

div – float

返回类型:

QTransform

这是一个重载函数。

返回将此矩阵与给定的 标量 按元素相乘的结果。

__add__(n)#
参数:

n – float

返回类型:

QTransform

__iadd__(div)#
参数:

div – float

返回类型:

QTransform

这是一个重载函数。

返回将给定 标量 添加到本矩阵每个元素的矩阵。

__sub__(n)#
参数:

n – float

返回类型:

QTransform

__isub__(div)#
参数:

div – float

返回类型:

QTransform

这是一个重载函数。

返回从本矩阵每个元素中减去给定 标量 的矩阵。

__div__(n)#
参数:

n – float

返回类型:

QTransform

操作符 /=(div)
参数:

div – float

返回类型:

QTransform

这是一个重载函数。

返回将本矩阵与给定的 标量 按元素相除的结果。

__eq__(arg__1)#
参数:

arg__1QTransform

返回类型:

bool

如果此矩阵等于给定的 矩阵,则返回 true,否则返回 false

静态 quadToQuad(arg__1, arg__2)#
参数:
返回类型:

object

静态 quadToQuad(one, two, result)
参数:
返回类型:

bool

创建一个变换矩阵trans,将四边形one映射到另一个四边形two。如果变换是可能的,则返回true;否则返回false。

这是一个方便的方法,结合了quadToSquare()squareToQuad()方法。它允许输入四边形被转换成任何其他四边形。

另请参阅

squareToQuad() quadToSquare()

静态 quadToSquare(arg__1)#
参数:

arg__1QPolygonF

返回类型:

object

静态 quadToSquare(quad, result)
参数:
返回类型:

bool

创建一个变换矩阵trans,将四边形quad映射到一个单位正方形。如果构造了变换,则返回true;如果没有这样的变换,则返回false。

另请参阅

squareToQuad() quadToQuad()

reset()#

将矩阵重置为单位矩阵,即除m11m22(指定缩放)及m33(设置为1)外,所有元素都设置为0。

另请参阅

QTransform() isIdentity() 基本 矩阵 操作

rotate(a[, axis=Qt.ZAxis])#
参数:
  • a – float

  • axisAxis

返回类型:

QTransform

这是一个重载函数。

根据指定的 axis,在距离屏幕 1024.0 的地方将坐标系逆时针旋转给定角度 a,并返回矩阵的引用。

请注意,如果您将 QTransform 应用到在窗口坐标中定义的点,则旋转的方向将是顺时针的,因为 y 轴指向下方。

角度以度为单位指定。

另请参阅

setMatrix

rotate(a, axis, distanceToPlane)
参数:
  • a – float

  • axisAxis

  • distanceToPlane – float

返回类型:

QTransform

根据指定的 axis,在距离屏幕 distanceToPlane 的地方将坐标系逆时针旋转给定角度 a,并返回矩阵的引用。

请注意,如果您将 QTransform 应用到在窗口坐标中定义的点,则旋转的方向将是顺时针的,因为 y 轴指向下方。

角度以度为单位指定。

如果 distanceToPlane 为零,则将其忽略。这适用于实现正交投影,其中应丢弃而不是投影 z 轴坐标。

另请参阅

setMatrix()

rotateRadians(a, axis, distanceToPlane)#
参数:
  • a – float

  • axisAxis

  • distanceToPlane – float

返回类型:

QTransform

根据指定的 axis,在距离屏幕 distanceToPlane 的地方将坐标系逆时针旋转给定角度 a,并返回矩阵的引用。

请注意,如果您将 QTransform 应用到在窗口坐标中定义的点,则旋转的方向将是顺时针的,因为 y 轴指向下方。

角度以弧度为单位指定。

如果 distanceToPlane 为零,则将其忽略。这适用于实现正交投影,其中应丢弃而不是投影 z 轴坐标。

另请参阅

setMatrix()

rotateRadians(a[, axis=Qt.ZAxis])
参数:
  • a – float

  • axisAxis

返回类型:

QTransform

这是一个重载函数。

根据指定的 axis,在距离屏幕 1024.0 的地方将坐标系逆时针旋转给定角度 a,并返回矩阵的引用。

请注意,如果您将 QTransform 应用到在窗口坐标中定义的点,则旋转的方向将是顺时针的,因为 y 轴指向下方。

角度以弧度为单位指定。

另请参阅

setMatrix()

scale(sx, sy)#
参数:
  • sx – float

  • sy – float

返回类型:

QTransform

以水平方向 sx 和垂直方向 sy 缩放坐标系,并返回矩阵的引用。

另请参阅

setMatrix()

setMatrix(m11, m12, m13, m21, m22, m23, m31, m32, m33)#
参数:
  • m11 – float

  • m12 – float

  • m13 – float

  • m21 – float

  • m22 – float

  • m23 – float

  • m31 – float

  • m32 – float

  • m33 – float

将矩阵元素设置为指定的值,m11m12m13m21m22m23m31m32 以及 m33。请注意,此函数将替换之前的值。《PySide6.QtGui.QTransform》提供了 translate()rotate()scale()shear() 便捷函数来基于当前定义的坐标系操作各种矩阵元素。

另请参阅

QTransform()

shear(sh, sv)#
参数:
  • sh – float

  • sv – float

返回类型:

QTransform

通过 sh 水平方向和 sv 垂直方向对坐标系进行扭曲,并返回矩阵的引用。

另请参阅

setMatrix()

static squareToQuad(arg__1)#
参数:

arg__1QPolygonF

返回类型:

object

static squareToQuad(square, result)
参数:
返回类型:

bool

创建一个转换矩阵,trans,将单位正方形映射到四边形,quad。如果转换可构建则返回 true;如果不存在此类转换则返回 false

translate(dx, dy)#
参数:
  • dx – float

  • dy – float

返回类型:

QTransform

将坐标系沿 x 轴移动 dx,沿 y 轴移动 dy,并返回矩阵的引用。

另请参阅

setMatrix()

transposed()#
返回类型:

QTransform

返回此矩阵的转置。

type()#
返回类型:

变换类型

返回此矩阵的变换类型。

变换类型是捕获矩阵所有变换的最高枚举值。例如,如果矩阵既缩放又倾斜,则类型将是 TxShear,因为 TxShear 的枚举值高于 TxScale

了解矩阵的变换类型对于优化很有用:您通常可以比处理通用情况更优地处理特定类型。