Qt繪圖——QPainter基本繪圖


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 函數 繪制 一個復合的圖形對象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM