首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Qt學習之路(28):QPainter 座標系統與變換詳解

     編輯:關於C++

掌握 QPainter 座標系統是精準繪圖的關鍵。預設座標原點 (0,0) 位於視窗左上角,X 軸向右、Y 軸向下,單位為像素。但像素中心實際位於「半像素座標」:像素 (x,y) 中心在 (x+0.5, y+0.5)。

0.5 像素偏移與反鋸齒

關閉反鋸齒時,繪製 (100,100) 像素,中心實際在 (100.5, 100.5);開啟反鋸齒則會在四鄰域像素混合,視覺中心落在 (100,100)。若需精準控制,需將座標系平移 (0.5, 0.5)。

上圖對比:無反鋸齒、有反鋸齒、平移座標後有反鋸齒三種情況下 drawRect(2,2,6,5) 的像素覆蓋差異。筆寬 (Pen width) 也會影響實際繪製範圍。

視口與視窗機制

QPainter 提供 setViewport()(物理座標)與 setWindow()(邏輯座標),實現與裝置解析度無關的繪圖。預設兩者一致。範例:在 320×200 元件中設定邏輯座標 (-50,-50) 到 (+50,+50),原點置中:

painter.setWindow(-50, -50, 100, 100);

邏輯座標 100×100 映射到物理 320×200。改變 window 範圍即可縮放、平移繪圖內容,無需修改繪圖邏輯。

世界座標變換

透過 QTransform 操作世界座標系,實現平移、縮放、旋轉、剪切。關鍵概念:**變換的是座標系,而非圖形本身**。

void PaintedWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QFont font("Courier", 24);
    painter.setFont(font);
    painter.drawText(50, 50, "Hello, world!");
    
    QTransform transform;
    transform.rotate(+45.0);  // 順時針旋轉 45 度
    painter.setWorldTransform(transform);
    painter.drawText(60, 60, "Hello, world!");
}

第二行文字隨座標系旋轉 45°。QPainter 為狀態機,變換僅影響後續繪圖操作。注意 drawText() 座標為文字**左下角**基線位置(非左上角)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved