Qt中每个窗口都有一个坐标系,默认窗口左上角为坐标原点,而后水平向右依次增大,水平向左依次减少,垂直向下依次增大,垂直向上依次减少。原点即为(0,0)点,以像素为单位增减。ide
坐标系变换是利用变换矩阵来进行的, 一般利用QTransform类来设置变换矩阵。QPainter类提供了对坐标系的平移,缩放,旋转,扭曲等变换函数。函数
void translate(const QPointF & offset)this
void translate(const QPoint & offset)spa
void translate(qreal dx, qreal dy)rest
void scale(qreal sx, qreal sy)orm
void shear(qreal sh, qreal sv)开发
void rotate(qreal angle)it
void save()io
void restore()form
QT利用translate()函数进行平移变换。
平移变换代码:
QPainter painter(this);
painter.setBrush(Qt::yellow);
painter.drawRect(0,0,50,50);
//将当前坐标系下的点(100,100)设为原点
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);
利用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);
利用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);
利用rotate()函数进行翻转变换。
翻转变换代码:
QPainter painter(this);
//以原点为中心,顺时针旋转30度
painter.rotate(30);
painter.drawLine(0,0,100,0) ;
//以原点为中心,顺时针再旋转30度
painter.rotate(30);
painter.drawLine(0,0,100,0);
绘图过程当中须要快速的进行坐标系切换,绘制出不一样的图形,所以须要对坐标系状态进行保护,能够先利用save()函数来保存坐标系如今的状态,而后进行变换操做,操做完以后,再用restore()函数将之前的坐标系状态恢复,本质是对坐标系进行入栈和出栈的操做。
坐标系状态保护代码:
QPainter painter(this);
//保存当前坐标系状态
painter.save();
//平移坐标系原点到(100, 100)
painter.translate(100,100);
painter.drawLine(0,0,50,50);
//将当前原点位于点(100, 100)的坐标系恢复到保存的坐标系状态
painter.restore();
painter.drawLine(0,0,50,50);