QT開發(十五)——QT座標系統

QT開發(十五)——QT座標系統

1、QT座標系簡介

    Qt中每個窗口都有一個座標系,默認窗口左上角爲座標原點,而後水平向右依次增大,水平向左依次減少,垂直向下依次增大,垂直向上依次減少。原點即爲(0,0)點,以像素爲單位增減。ide

2、座標系變換

    座標系變換是利用變換矩陣來進行的, 一般利用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

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

相關文章
相關標籤/搜索