反鋸齒是 2D 繪圖品質的關鍵技術。Qt 預設關閉反鋸齒以追求效能,本文深入解析其原理、啟用方式、適用場景與不適用場景,助你做出正確取捨。
螢幕像素為離散方格,幾何圖形 (直線、圓、曲線) 光柵化時,邊緣像素要麼全亮、要么全暗,形成階梯狀「鋸齒」。
反鋸齒核心思想:對邊緣像素計算**覆蓋率** (0.0~1.0),以此為權重混合前景色與背景色,產生平滑過渡。
無反鋸齒: ████ ████
████ → ████ (階梯狀邊緣)
████ ████
有反鋸齒: ░░██ ░░██
████ → ██░░ (邊緣像素半透明混合)
██░░ ░░░░
void PaintedWidget::paintEvent(QPaintEvent *event) {
QPainter painter(this);
// 畫筆: 黑色、寬 5px、虛點線、圓形端點
painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap));
painter.setBrush(Qt::yellow);
// 左側: 無反鋸齒
painter.drawEllipse(50, 150, 200, 150);
// ★ 關鍵一行:啟用反鋸齒渲染提示
painter.setRenderHint(QPainter::Antialiasing, true);
// 右側: 有反鋸齒
painter.drawEllipse(300, 150, 200, 150);
}

| 提示常數 | 作用 | 效能影響 |
|---|---|---|
Antialiasing | 幾何圖形邊緣平滑 | 中等 (~2-3x 像素運算) |
TextAntialiasing | 文字邊緣平滑 | 低 (僅字型光柵化) |
SmoothPixmapTransform | 圖片縮放/旋轉雙線性插值 | 中等 |
HighQualityAntialiasing | OpenGL 引擎專用高品質模式 | 高 |
NonCosmeticDefaultPen | 預設畫筆視為幾何筆 (受縮放影響) | 無 |
像 Photoshop 鉛筆工具、圖示編輯器、像素畫軟體,需精確控制單一像素。
放大 3200% 視圖: 鉛筆 (無 AA): ████████ (銳利 1px 邊緣) 畫筆 (有 AA): ░░██░░░░ (模糊邊緣,無法精確編輯單像素)
反鋸齒邊緣的半透明像素會干擾 QPainterPath::contains()、QRegion 等幾何運算。
列印至單色印表機、生成單色位圖 (QImage::Format_Mono) 時,反鋸齒無意義且浪費算力。
paintEvent 開頭啟用 Antialiasing | TextAntialiasingsetRenderHint(..., false)drawPixmap() 縮放時啟用 SmoothPixmapTransformQOpenGLWidget + HighQualityAntialiasing 將反鋸齒卸載至 GPUvoid MyWidget::paintEvent(QPaintEvent*) {
QPainter p(this);
// 全域高品質設定
p.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
// 繪製複雜場景...
drawBackground(p);
drawShapes(p);
// 僅此處關閉:畫像素對齊網格
p.setRenderHint(QPainter::Antialiasing, false);
drawPixelGrid(p);
// 繼續高品質繪製
p.setRenderHint(QPainter::Antialiasing, true);
drawForeground(p);
}
善用反鋸齒,讓 Qt 介面擁有專業級視覺品質;懂得關閉它,則是效能優化的智慧。