Qt 繪圖轉換

轉換

QTransform 用於指定座標系的 2D 轉換 - 平移、縮放、扭曲(剪切)、旋轉或投影座標系。繪製圖形時,通常會使用。
QTransform 與 QMatrix 不同之處在於,它是一個真正的 3x3 矩陣,允許視角轉換,QTransform 的 toAffine() 方法允許將 QTransform 轉換到QMatrix。如果視角轉換已在矩陣指定,則轉換將導致數據丟失。

常用接口

translate(qreal dx, qreal dy):平移 - 對座標系沿着 x 軸移動 dx、沿 y 軸移動 dy
scale(qreal sx, qreal sy):縮放 - 通過水平的 sx 和垂直的 sy 縮放座標系
rotate(qreal angle, Qt::Axis axis = Qt::ZAxis):旋轉 - 對指定的軸用給定的角度反時針旋轉座標系統
shear(qreal sh, qreal sv):扭曲 - 通過水平的 sh 和垂直的 sv 扭曲座標系
reset():重置爲單位矩陣

示例:
座標原點 (0, 0) 位置開始,大小爲 150 * 150 的區域內,繪製了一張圖片

QPainter painter(this);

// 反走樣
painter.setRenderHint(QPainter::Antialiasing, true);

painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));

平移

translate() 可將座標原點變更爲指定的座標點 (x, y)。

示例:
將座標原點由 (0, 0) 變爲 (120, 20)。

QPainter painter(this);

// 反走樣
painter.setRenderHint(QPainter::Antialiasing, true);

QTransform transform;
// 平移
transform.translate(120, 20);

painter.setTransform(transform);
painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));

旋轉

rotate() 使用角度技巧表示遠近。設置第二個參數爲角度的常量值後,可以使用 X 軸、Y 軸、Z 軸技巧。它默認是以原點爲中心進行旋轉的,如果要改變旋轉的中心,可以使用 translate() 函數完成。

示例:

QPainter painter(this);

// 反走樣
painter.setRenderHint(QPainter::Antialiasing, true);

QTransform transform;
// 平移
transform.translate(120, 20);
// 旋轉
transform.rotate(45, Qt::XAxis);

painter.setTransform(transform);
painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));

縮放

scale() 可以進行縮放。

示例:
使繪製的圖像縮小到原來的一半

QPainter painter(this);

// 反走樣
painter.setRenderHint(QPainter::Antialiasing, true);

QTransform transform;
// 平移
transform.translate(120, 20);
// 旋轉
transform.rotate(45);
// 縮放
transform.scale(0.5, 0.5);

painter.setTransform(transform);
painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));

扭曲

shear() 可以實現圖片的扭曲。它有兩個參數,前面的參數實現橫向變形,後面的參數實現縱向變形。當它們的值爲 0 時,表示不扭曲。

示例:

QPainter painter(this);

// 反走樣
painter.setRenderHint(QPainter::Antialiasing, true);

QTransform transform;
// 橫向扭曲
transform.shear(0.5, 0);

painter.setTransform(transform);
painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章