Qt的繪圖系統基於 QPainter QPaintDevice 和 QPaintEngine類
1). QPainter : 用於繪圖操作的類
2).QPaintDevice : 可以使用QPainter進行繪圖的抽象的二維界面
3).QPaintEngine : 為QPainter提供在不同設備上繪圖的接口,由QPainter和QPainterDevice內部使用,應用程序無需調用QPaintEngine,除非要創建自己的設備類型
一般繪圖設備包括:QWidget 、QPixmap、QImage等,這些繪圖設備為QPainter提供一個“畫布”
1. QWidget類及其子類是最常用的繪圖設備,從QWidget繼承的類都有QPaintEvent事件 ,要在設備上繪圖,只需要重定義此事件,並編寫響應代碼
::paintEvent(QPaintEvent *e)
{
QPainter painter(this)//繪制與繪圖設備關聯的QPainter對象
//painter在設備的窗口上繪圖
}
2 . QPainter繪圖的主要屬性
QPainter繪圖,主要繪制一些基本圖形元素(點、直線、圓形、矩形、曲線、文字),控制這些繪圖元素特性的主要是QPainter的3個屬性:
1) pen屬性 : 是一個QPen對象,用於控制線條的顏色、寬度、線型
2)brush屬性 : 是一個QBrush對象,用於一個區域的填充特性,可以設置填充顏色、填充方式、漸變特性等
3)font屬性: 是一個QFont對象,用於繪制顏色的時候,設置文字的字體樣式、大小屬性
使用3個屬性基本控制繪圖的基本特點,還有其他功能可結合使用:疊加 旋轉和縮放
3. QPen 用於繪圖時對線條的設置,主要包括線寬,顏色,線型等,QPen類的主要接口函數,通常一個設置函數都有一個對應的讀取函數
setColor(QColor &color) // 設置畫筆顏色 線條顏色
setWidth(int width) // 設置線條寬度
setStyle(Qt::PenStyle style) // 設置線條樣式,參數為Qt::PenStyle枚舉類型
setCapStyle(Qt::PenCapStyle style) // 設置線條端點樣式
setJoinStyle(Qt::PenJoinStyle style) // 設置連接樣式
4. QBrush 用於繪圖時填充特性:填充顏色 填充樣式、材質填充時的材質圖片
setColor(QColor &color) //設置畫刷顏色,實體填充即為填充色
setStyle(Qt::BrushStyle style) //設置畫刷樣式
setTexture(QPixmap &pixmap) //設置一個QPixmap類型的圖片作為畫刷的圖片,畫刷樣式自動設置為Qt::TexturePattern
setTextureImage(QImage &image) //設置一個QImage類型的圖片作為畫刷圖片,畫刷樣式自動設置為Qt::TexturePattern
setStyle(Qt::BrushStyle style) //設置畫刷樣式
Qt::SolidPatton // 單一顏色填充
Qt::HorPatton // 水平線填充
Qt::VerPatton // 垂直線填充
Qt::TexturePattern // 材質填充 需要指定texture 或者 textureImage圖片
Qt::QLinearGradient // 線性漸變
Qt::QRadialGradient // 輻射漸變
Qt::QConicalGradient // 圓錐漸變
1 QPixmap texturePixmap(":images/images/texture.jpg"); 2 QBrush brush 3 brush.setStyle(Qt::TexturePattern) // 畫刷填充材質 4 brush.setTexture(texturePixmap) // 設置材質圖片 5 painter.setBrush(brush)
5 .QBrush 中的漸變填充
3個實現漸變填充的類:
1) QLinearGradient //線性漸變 制定一個起點和顏色,一個終點及其顏色,還可以指定中間某點顏色,起點和終點之間的顏色會線性插值計算
2) QRadialGradient //簡單輻射和擴展輻射
3) QConicalGradient //圓錐形漸變
還需要用到方法 setSpread(QGradient::Spread method)函數設置延展方式,圓錐形填充沒有延展效果
PadSpread 用結束點的顏色填充外部區域(缺省)
RepeatSpread 重復使用簡便方式填充外部區域
ReflectSpread 反射式重復使用簡便方式填充外部區域
1 #include "paintt.h" 2 #include "ui_paintt.h" 3 #include <QPaintEvent> 4 #include <QPainter> 5 6 7 PaintT::PaintT(QWidget *parent) : 8 QWidget(parent), 9 ui(new Ui::PaintT) 10 { 11 ui->setupUi(this); 12 setPalette(QPalette(Qt::white));//控件調色板 設置窗口為白色背景 13 setAutoFillBackground(true); 14 } 15 16 PaintT::~PaintT() 17 { 18 delete ui; 19 } 20 21 void PaintT::paintEvent(QPaintEvent *event) 22 { 23 QPainter painter(this); 24 painter.setRenderHint(QPainter::Antialiasing); //線條抗鋸齒 25 painter.setRenderHint(QPainter::TextAntialiasing); 26 27 int w = this->width(); //繪圖區寬度 28 int h = this->height(); //繪圖區高度 29 #if 0 30 QRect rect(w/4 ,h/4,w/2,h/2); //中間區域矩形框 這個矩形隨着widget大小變化而變化 31 QPen pen ; 32 pen.setWidth(3); 33 pen.setColor(Qt::red); 34 pen.setStyle(Qt::DashDotLine); 35 pen.setCapStyle(Qt::FlatCap); 36 pen.setJoinStyle(Qt::BevelJoin); 37 painter.setPen(pen); 38 39 QBrush brush; 40 brush.setColor(Qt::yellow); 41 brush.setStyle(Qt::SolidPattern); 42 painter.setBrush(brush); 43 #endif 44 //QRadialGradient::QRadialGradient(qreal cx, qreal cy, qreal radius, qreal fx, qreal fy) 45 QRadialGradient radialGrad(w/2,h/2,qMax(w/8,h/8),w/2,h/2);//輻射填充中心點,輻射填充去半徑,焦點坐標 46 radialGrad.setColorAt(0,Qt::green); // 這里使用邏輯坐標 47 radialGrad.setColorAt(1,Qt::blue); // 0 起點:輻射中心點 1 終點:填充區圓周 48 radialGrad.setSpread(QGradient::ReflectSpread); 49 painter.setBrush(radialGrad); 50 51 painter.drawRect(this->rect()); //即widget窗口的整個矩形,大於定義的輻射填充區域有延展效果 52 }
自帶催眠眩暈效果,不停繪制刷新,不知道會不會出現動態效果
6.QPainter 中的 drawPath 函數 繪制 一個復合的圖形對象