QTransform是Qt中推荐的转换类。转换指定如何平移,缩放,剪切,旋转或投影坐标系,通常在渲染图形时使用。
QTransform类支持矩阵乘法,加法和减法,并且可以流式传输和比较该类的对象。
渲染图形时,矩阵定义了转换,但是实际的转换由QPainter执行。默认情况下,QPainter在关联设备自己的坐标系上运行。QPaintDevice的标准坐标系的原点位于左上角。x值向右增加; y值向下增加。
QPainter具有无需使用QTransform即可平移,缩放,剪切和旋转坐标系的功能。 例如:
QPainter painter(this);
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并调用QPainter::setTransform()会更加高效。 例如:
QPainter painter(this);
painter.setPen(QPen(Qt::blue, 1, Qt::DashLine));
painter.drawRect(0, 0, 100, 100);
QTransform transform;
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");
一个QTransform对象包含一个3 x 3的矩阵。
QTransform使用以下公式将平面中的一个点转换为另一个点:
x' = m11*x + m21*y + dx
y' = m22*y + m12*x + dy
if (is not affine)
{
w' = m13*x + m23*y + m33
x' /= w'
y' /= w'
}
点(x,y)是原始点,(x',y')是变换后的点。通过对inverted()(倒置)矩阵执行相同的运算,可以将(x',y')转换回(x,y)。
1、QTransform(qreal m11, qreal m12, qreal m21, qreal m22, qreal dx, qreal dy)
QTransform(qreal m11, qreal m12, qreal m13, qreal m21, qreal m22, qreal m23, qreal m31, qreal m32, qreal m33 = 1.0)
构造函数。
2、QTransform()
m11、m22、m33设置为1,其他元素设置为零。
3、qreal m11() const ~ qreal QTransform::m33()
获取各矩阵值。
4、QTransform adjoint()
获取矩阵的伴随矩阵。伴随矩阵
5、qreal determinant()
返回矩阵的行列式。行列式
6、[static] QTransform fromScale(qreal sx, qreal sy)
创建一个QTransform,矩阵对应于水平sx和垂直sy的缩放比例。 这与scale(sx,sy)相同,但速度稍快。
7、[static] QTransform fromTranslate(qreal dx, qreal dy)
创建一个QTransform,阵对应于dx沿x轴和平移dy沿y轴平移。 这与translate(dx,dy)相同,但速度稍快。
8、QTransform inverted(bool *invertible = nullptr)
返回此矩阵的转置矩阵。如果矩阵是奇异的(不可逆),则返回的矩阵是恒等矩阵。 如果参数不为空,则如果矩阵是Invertible,则将其值设置为true,否则将其设置为false。
9、bool isAffine()
矩阵是否是仿射变换矩阵。仿射变换
10、bool isIdentity()
矩阵是否是单位矩阵。单位矩阵
11、bool isInvertible()
矩阵是否可逆。
12、bool isRotating()
矩阵是否表示某种旋转变换。180度和/或360度的旋转变换被视为缩放变换。
13、bool isScaling()
矩阵是否表示比例转换。
14、bool isTranslating()
矩阵是否平移矩阵。
15、QPoint map(const QPoint &p)
QPointF map(const QPointF &p)
QLine map(const QLine &l)
QLineF map(const QLineF &l)
QPolygonF map(const QPolygonF &a)
QPolygon map(const QPolygon &a)
QRegion map(const QRegion &r)
QPainterPath map(const QPainterPath &p)
void map(int x, int y, int *tx, int *ty)
void map(qreal x, qreal y, qreal *tx, qreal *ty)
QRectF mapRect(const QRectF &rectangle)
QRect mapRect(const QRect &rectangle)
QPolygon mapToPolygon(const QRect &rectangle)
把一个图形映射到矩阵坐标。
例,绘制矩形和圆心在(200,200)的圆:
QPainter painter(this);
painter.setPen(QPen(Qt::blue, 1, Qt::DashLine));
painter.drawRect(0, 0, 100, 100);
painter.setBrush(Qt::red);
painter.drawEllipse(QPoint(200,200),10,10);
QTransform transform;
transform.translate(50, 50);
transform.scale(0.5, 0.5);
painter.setTransform(transform);
painter.setPen(QPen(Qt::cyan, 1, Qt::DashDotLine));
painter.drawRect(0, 0, 100, 100);
auto point = transform.map(QPoint(200,200));
qDebug()<
把点(200,200)做映射后绘制同样的形状:
16、[static] bool quadToQuad(const QPolygonF &one, const QPolygonF &two, QTransform &trans)
多边形能否one映射到另一个多边形two。
17、[static] bool quadToSquare(const QPolygonF &quad, QTransform &trans)
多边形quad能否在trans中映射为单位正方形。
18、void reset()
将矩阵重置为单位矩阵,即所有元素均设置为零,m11、m22、m33设置为1,其他元素设为0。
19、QTransform &rotate(qreal angle, Qt::Axis axis = Qt::ZAxis)
QTransform &rotateRadians(qreal angle, Qt::Axis axis = Qt::ZAxis)
围绕指定的轴逆时针旋转坐标系,并返回对矩阵的引用。如果将QTransform应用于QWidget坐标中定义的点,则旋转方向将为顺时针方向,因为y轴指向下方。
QPainter painter(this);
auto rectPoint = event->rect().center();
QTransform transform;
transform.translate(rectPoint.x(),rectPoint.y());
transform.rotate(45);
painter.setTransform(transform);
painter.setPen(QPen(Qt::cyan, 3, Qt::DashDotLine));
painter.drawRect(0, 0, 100, 100);
20、QTransform &scale(qreal sx, qreal sy)
按sx水平和sy垂直缩放坐标系,并返回对矩阵的引用。
auto rectPoint = event->rect().center();
QTransform transform;
transform.translate(rectPoint.x(),rectPoint.y());
transform.scale(0.5,0.5);
painter.setTransform(transform);
painter.setPen(QPen(Qt::cyan, 3, Qt::DashDotLine));
painter.drawRect(0, 0, 100, 100);
21、void setMatrix(qreal m11, qreal m12, qreal m13, qreal m21, qreal m22, qreal m23, qreal m31, qreal m32, qreal m33)
设置矩阵。
22、QTransform &shear(qreal sh, qreal sv)
水平剪切水平轴,垂直剪切水平轴sv,并返回对矩阵的引用。
auto rectPoint = event->rect().center();
QTransform transform;
transform.translate(rectPoint.x(),rectPoint.y());
painter.setTransform(transform);
painter.setPen(QPen(Qt::red, 3, Qt::DashDotLine));
painter.drawRect(0, 0, 100, 100);
transform.shear(0.5,0.5);
painter.setTransform(transform);
painter.setPen(QPen(Qt::cyan, 3, Qt::DashDotLine));
painter.drawRect(0, 0, 100, 100);
23、[static] bool squareToQuad(const QPolygonF &quad, QTransform &trans)
变换矩阵trans是否可以将单位正方形映射到多边形quad。
24、QTransform &translate(qreal dx, qreal dy)
沿x轴移动坐标系dx并沿y轴移动dy,并返回对矩阵的引用。
25、QTransform transposed()
返回此矩阵的转置。