進入 Qt 2D 繪圖領域,核心在於理解 QPainter、QPaintDevice、QPaintEngine 三位一體的架構設計。本文帶你從零構建第一個繪圖視窗,掌握基本圖形繪製與畫筆/畫刷設定。
QWidget (螢幕)、QImage (離屏)、QPixmap、QPrinter (列印)
// paintedwidget.h
class PaintedWidget : public QWidget {
Q_OBJECT
public:
PaintedWidget(QWidget *parent = nullptr);
protected:
void paintEvent(QPaintEvent *event) override;
};
// paintedwidget.cpp
PaintedWidget::PaintedWidget(QWidget *parent) : QWidget(parent) {
resize(800, 600);
setWindowTitle(tr("Paint Demo"));
}
void PaintedWidget::paintEvent(QPaintEvent *event) {
QPainter painter(this); // 綁定到此 QWidget (QPaintDevice)
// 1. 畫直線 (預設黑色、實線、寬度 1)
painter.drawLine(80, 100, 650, 500);
// 2. 設定紅色畫筆畫矩形
painter.setPen(Qt::red);
painter.drawRect(10, 10, 100, 400);
// 3. 綠色寬筆 + 藍色填充畫橢圓
painter.setPen(QPen(Qt::green, 5));
painter.setBrush(Qt::blue);
painter.drawEllipse(50, 150, 400, 200);
}
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
PaintedWidget w;
w.show();
return app.exec();
}
setPen()、setBrush()、setFont()、setTransform() 等設定會影響**後續**所有繪圖指令,直到再次變更或銷毀。
| 函數 | 說明 | 典型參數 |
|---|---|---|
drawLine() | 直線 | x1,y1,x2,y2 或 QPointF |
drawRect() | 矩形框 | x,y,w,h 或 QRectF |
drawEllipse() | 橢圓/圓 | 外接矩形 x,y,w,h |
drawPath() | 複雜路徑 | QPainterPath |
drawText() | 文字 | 位置 + 字串 |
drawPixmap() | 圖片 | 位置 + QPixmap |
// QPen 建構式: 顏色、寬度、線型、端點樣式、連接樣式
QPen pen(Qt::black, 3, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin);
painter.setPen(pen);
// QBrush: 純色、漸層、紋理圖案
painter.setBrush(Qt::yellow); // 純色
painter.setBrush(QBrush(QColor(255,0,0,128))); // 半透明紅
painter.setBrush(QBrush(QPixmap("pattern.png"))); // 紋理填充
end(),無需手動管理painter.setRenderHint(QPainter::Antialiasing) — 下篇詳細講解掌握 QPainter 基礎,你已能繪製任意 2D 圖形。下一步將探討反鋸齒、座標變換與進階繪圖技巧。