QPen
QPen 是 Qt 框架中用于定義繪圖時使用的畫筆屬性的類。在使用 QPainter 進行 2D 繪圖時,QPen 可以控制線條的外觀,比如線條的顏色、寬度、樣式(如實線、虛線等)、端點樣式(如方形端點、圓形端點等)和連接樣式(如斜接、圓角連接等)。
主要屬性
顏色(QColor):用于指定線條的顏色。可以使用預定義的顏色(如 Qt::red、Qt::blue 等),也可以自定義 RGB 值。
寬度(qreal):指定線條的寬度,單位通常是像素。
樣式(Qt::PenStyle):定義線條的樣式,例如實線(Qt::SolidLine)、虛線(Qt::DashLine)、點線(Qt::DotLine)等。
端點樣式(Qt::PenCapStyle):確定線條端點的外觀,如方形端點(Qt::SquareCap)、圓形端點(Qt::RoundCap)等。
連接樣式(Qt::PenJoinStyle):用于設置兩條線條連接處的樣式,如斜接(Qt::MiterJoin)、圓角連接(Qt::RoundJoin)等。
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QPainterPath>class PenExampleWidget : public QWidget {
protected:void paintEvent(QPaintEvent *event) override {Q_UNUSED(event);QPainter painter(this);// 創建不同屬性的 QPen 對象并繪制線條// 1. 紅色實線,寬度為 2 像素QPen pen1(Qt::red);pen1.setWidth(2);painter.setPen(pen1);painter.drawLine(20, 20, 200, 20);// 2. 藍色虛線,寬度為 3 像素QPen pen2(Qt::blue);pen2.setWidth(3);pen2.setStyle(Qt::DashLine);painter.setPen(pen2);painter.drawLine(20, 50, 200, 50);// 3. 綠色點線,寬度為 4 像素,圓形端點QPen pen3(Qt::green);pen3.setWidth(4);pen3.setStyle(Qt::DotLine);pen3.setCapStyle(Qt::RoundCap);painter.setPen(pen3);painter.drawLine(20, 80, 200, 80);// 4. 紫色實線,寬度為 5 像素,圓角連接QPen pen4(Qt::magenta);pen4.setWidth(5);pen4.setJoinStyle(Qt::RoundJoin);QPainterPath path;path.moveTo(20, 110);path.lineTo(100, 110);path.lineTo(100, 200);painter.setPen(pen4);painter.drawPath(path);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);PenExampleWidget widget;widget.setWindowTitle("QPen Example");widget.resize(300, 250);widget.show();return app.exec();
}
頭文件包含:
QApplication:管理 Qt 應用程序的資源和事件循環。
QWidget:作為窗口的基類。
QPainter:用于實際的繪圖操作。
QPen:用于定義畫筆的屬性。
自定義窗口類 PenExampleWidget:
繼承自 QWidget,并重寫 paintEvent 函數,在該函數中進行繪圖操作。
paintEvent 函數:
紅色實線:創建 pen1,設置顏色為紅色,寬度為 2 像素,然后使用 painter.setPen(pen1) 設置畫筆,最后繪制一條水平直線。
藍色虛線:創建 pen2,設置顏色為藍色,寬度為 3 像素,樣式為虛線(Qt::DashLine),再設置畫筆并繪制直線。
綠色點線:創建 pen3,設置顏色為綠色,寬度為 4 像素,樣式為點線(Qt::DotLine),端點樣式為圓形(Qt::RoundCap),然后繪制直線。
紫色實線及圓角連接:創建 pen4,設置顏色為紫色,寬度為 5 像素,連接樣式為圓角連接(Qt::RoundJoin)。使用 QPainterPath 創建一個路徑,包含兩條線段,最后使用設置好的畫筆繪制該路徑。
主函數:
創建 QApplication 對象,啟動應用程序。
創建 PenExampleWidget 實例,設置窗口標題和大小,并顯示窗口。
調用 app.exec() 進入事件循環,等待用戶操作。
看到窗口中繪制了四條不同樣式的線條,直觀展示了 QPen 不同屬性的效果。
QBrush
QBrush 是 Qt 框架中用于定義填充圖案和顏色的類,在使用 QPainter 進行 2D 繪圖時,QBrush 可用于填充各種圖形(如矩形、橢圓等),控制圖形內部的顏色和填充樣式。
主要屬性
顏色(QColor):指定填充的顏色,可以使用預定義的顏色(如 Qt::red、Qt::blue 等),也可以通過 RGB 值自定義顏色。
樣式(Qt::BrushStyle):定義填充的樣式,常見的樣式有:
Qt::SolidPattern:實心填充,使用指定的顏色完全填充圖形。
Qt::Dense1Pattern - Qt::Dense7Pattern:不同密度的疏密填充圖案。
Qt::HorPattern、Qt::VerPattern、Qt::CrossPattern 等:水平、垂直、交叉等線條圖案。
漸變(QGradient):除了純色填充,QBrush 還支持使用漸變填充,如線性漸變(QLinearGradient)、徑向漸變(QRadialGradient)和錐形漸變(QConicalGradient)。
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QBrush>
#include <QLinearGradient>class BrushExampleWidget : public QWidget {
protected:void paintEvent(QPaintEvent *event) override {Q_UNUSED(event);QPainter painter(this);// 1. 實心填充QBrush solidBrush(Qt::red, Qt::SolidPattern);painter.setBrush(solidBrush);painter.drawRect(20, 20, 100, 100);// 2. 疏密填充QBrush denseBrush(Qt::blue, Qt::Dense3Pattern);painter.setBrush(denseBrush);painter.drawRect(140, 20, 100, 100);// 3. 線性漸變填充QLinearGradient linearGradient(20, 140, 120, 140);linearGradient.setColorAt(0.0, Qt::green);linearGradient.setColorAt(1.0, Qt::yellow);QBrush gradientBrush(linearGradient);painter.setBrush(gradientBrush);painter.drawRect(20, 140, 100, 100);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);BrushExampleWidget widget;widget.setWindowTitle("QBrush Example");widget.resize(260, 260);widget.show();return app.exec();
}
頭文件包含
QApplication:管理 Qt 應用程序的資源和事件循環。
QWidget:作為窗口的基類。
QPainter:用于實際的繪圖操作。
QBrush:用于定義填充的屬性。
QLinearGradient:用于創建線性漸變。
2. 自定義窗口類 BrushExampleWidget
繼承自 QWidget,并重寫 paintEvent 函數,在該函數中進行繪圖操作。
3. paintEvent 函數
實心填充:
創建 solidBrush,使用紅色(Qt::red)和實心填充樣式(Qt::SolidPattern)。
使用 painter.setBrush(solidBrush) 設置畫刷,然后使用 painter.drawRect 繪制一個矩形,該矩形將被紅色實心填充。
疏密填充:
創建 denseBrush,使用藍色(Qt::blue)和 Qt::Dense3Pattern 疏密填充樣式。
設置畫刷并繪制另一個矩形,該矩形將顯示為藍色的疏密填充效果。
線性漸變填充:
創建 linearGradient 線性漸變對象,設置起始點和結束點,以及漸變的顏色停止點(從綠色到黃色)。
使用 gradientBrush 畫刷將線性漸變應用到填充中。
設置畫刷并繪制第三個矩形,該矩形將顯示為從綠色到黃色的線性漸變填充效果。
4. 主函數
創建 QApplication 對象,啟動應用程序。
創建 BrushExampleWidget 實例,設置窗口標題和大小,并顯示窗口。
調用 app.exec() 進入事件循環,等待用戶操作。
看到窗口中繪制了三個矩形,分別展示了實心填充、疏密填充和線性漸變填充的效果。
與圖形抗鋸齒的關聯
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QBrush>class AntialiasingExampleWidget : public QWidget {
protected:void paintEvent(QPaintEvent *event) override {Q_UNUSED(event);QPainter painter(this);// 不開啟抗鋸齒繪制橢圓QPen pen1(Qt::red, 2);QBrush brush1(Qt::yellow, Qt::SolidPattern);painter.setPen(pen1);painter.setBrush(brush1);painter.drawEllipse(20, 20, 100, 100);// 開啟抗鋸齒繪制橢圓painter.setRenderHint(QPainter::Antialiasing);QPen pen2(Qt::blue, 2);QBrush brush2(Qt::green, Qt::SolidPattern);painter.setPen(pen2);painter.setBrush(brush2);painter.drawEllipse(150, 20, 100, 100);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);AntialiasingExampleWidget widget;widget.setWindowTitle("Antialiasing Example");widget.resize(300, 150);widget.show();return app.exec();
}
包含了必要的 Qt 頭文件,分別用于管理應用程序、創建窗口、進行繪圖操作、設置
AntialiasingExampleWidget
繼承自 QWidget 并重寫 paintEvent 函數,在該函數中進行繪圖操作。
創建一個紅色、寬度為 2 像素的 QPen 和一個黃色實心填充的 QBrush,然后使用 QPainter 在坐標 (20, 20) 處繪制一個寬度和高度均為 100 的橢圓,此時未開啟抗鋸齒功能。
接著,使用 setRenderHint(QPainter::Antialiasing) 開啟抗鋸齒功能。創建一個藍色、寬度為 2 像素的 QPen 和一個綠色實心填充的 QBrush,然后在坐標 (150, 20) 處繪制另一個寬度和高度均為 100 的橢圓。
創建 QApplication 對象來管理應用程序,創建 AntialiasingExampleWidget 窗口實例,設置窗口標題和大小,顯示窗口并進入應用程序的事件循環。
看到窗口中繪制了兩個橢圓,開啟抗鋸齒的橢圓邊緣會更加平滑,而未開啟抗鋸齒的橢圓邊緣可能會有鋸齒狀。