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);