首页 > 代码库 > QT开发(十五)——QT坐标系统

QT开发(十五)——QT坐标系统

QT开发(十五)——QT坐标系统

一、QT坐标系简介

    Qt中每一个窗口都有一个坐标系,默认窗口左上角为坐标原点,然后水平向右依次增大,水平向左依次减小,垂直向下依次增大,垂直向上依次减小。原点即为(0,0)点,以像素为单位增减。

二、坐标系变换

    坐标系变换是利用变换矩阵来进行的, 通常利用QTransform类来设置变换矩阵QPainter类提供了对坐标系的平移,缩放,旋转,扭曲等变换函数。

    void translate(const QPointF & offset)

    void translate(const QPoint & offset)

    void translate(qreal dx, qreal dy)

    void scale(qreal sx, qreal sy)

    void shear(qreal sh, qreal sv)

    void rotate(qreal angle)

    void save()

    void restore()

1、平移变换

    QT利用translate()函数进行平移变换

    平移变换代码:

    QPainter painter(this);

    painter.setBrush(Qt::yellow);

    painter.drawRect(0,0,50,50);

    //将当前坐标系下的点(100100)设为原点

    painter.translate(100,100);

    painter.setBrush(Qt::red);

    painter.drawRect(0,0,50,50);

    //将当前坐标系下的点(-100-100)设为原点

    painter.translate(-100,-100);

    painter.drawLine(0,0,20,20);

2、比例变换

    利用scale()函数进行比例变换,实现缩放效果

    比例变换代码:

    QPainter painter(this);

    painter.setBrush(Qt::yellow);

    painter.drawRect(0,0,100,100);

    //将坐标系在x,y方向放大2

    painter.scale(2,2);

    painter.setBrush(Qt::red);

    painter.drawRect(50,50,50,50);

3、扭曲变换

    利用shear()函数就行扭曲变换。

    扭曲变换代码:

    QPainter painter(this);

    painter.setBrush(Qt::yellow);

    painter.drawRect(0,0,50,50);

    //对当前坐标系的y轴进行扭曲

    painter.shear(0,1);

    painter.setBrush(Qt::red);

    painter.drawRect(50,0,50,50);

4、翻转变换

    利用rotate()函数进行翻转变换。

    翻转变换代码:

    QPainter painter(this);

    //以原点为中心,顺时针旋转30

    painter.rotate(30);

    painter.drawLine(0,0,100,0) ;

    //以原点为中心,顺时针再旋转30

    painter.rotate(30);

    painter.drawLine(0,0,100,0);

5、坐标系状态的保护

    绘图过程中需要快速的进行坐标系切换,绘制出不同的图形,因此需要对坐标系状态进行保护,可以先利用save()函数来保存坐标系现在的状态,然后进行变换操作,操作完之后,再用restore()函数将以前的坐标系状态恢复,本质对坐标系进行入栈和出栈的操作。

    坐标系状态保护代码:

    QPainter painter(this);

    //保存当前坐标系状态

    painter.save();

    //平移坐标系原点到(100100

    painter.translate(100,100);

    painter.drawLine(0,0,50,50);

    //将当前原点位于点(100100)的坐标系恢复到保存的坐标系状态

    painter.restore();

    painter.drawLine(0,0,50,50);


本文出自 “生命不息,奋斗不止” 博客,谢绝转载!

QT开发(十五)——QT坐标系统