程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> QPainter--畫筆(QPen)和畫刷(QBrush),qpainter--qpen

QPainter--畫筆(QPen)和畫刷(QBrush),qpainter--qpen

編輯:C++入門知識

QPainter--畫筆(QPen)和畫刷(QBrush),qpainter--qpen


文章轉載自:https://www.devbean.net/2012/11/qt-study-road-2-brush-pen/

 

前面一章我們提到,Qt 繪圖系統定義了兩個繪制時使用的關鍵屬性:畫刷和畫筆。前者使用QBrush描述,大多用於填充;後者使用QPen描述,大多用於繪制輪廓線。

 

QBrush定義了QPainter的填充模式,具有樣式、顏色、漸變以及紋理等屬性。

畫刷的style()定義了填充的樣式,使用Qt::BrushStyle枚舉,默認值是Qt::NoBrush,也就是不進行任何填充。我們可以從下面的圖示中看到各種填充樣式的區別:

 

畫刷的color()定義了填充模式的顏色。這個顏色可以是 Qt 預定義的顏色常量,也就是Qt::GlobalColor,也可以是任意QColor對象。

畫刷的gradient()定義了漸變填充。這個屬性只有在樣式是Qt::LinearGradientPatternQt::RadialGradientPattern或者Qt::ConicalGradientPattern之一時才有效。漸變可以由QGradient對象表示。Qt 提供了三種漸變:QLinearGradientQConicalGradientQRadialGradient,它們都是QGradient的子類。我們可以使用如下代碼片段來定義一個漸變的畫刷:

1 QRadialGradient gradient(50, 50, 50, 50, 50);
2 gradient.setColorAt(0, QColor::fromRgbF(0, 1, 0, 1));
3 gradient.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0));
4  
5 QBrush brush(gradient);

當畫刷樣式是 Qt::TexturePattern時,texture()定義了用於填充的紋理。注意,即使你沒有設置樣式為Qt::TexturePattern,當你調用setTexture()函數時,QBrush會自動將style()設置為Qt::TexturePattern

QPen定義了用於QPainter應該怎樣畫線或者輪廓線。畫筆具有樣式、寬度、畫刷、筆帽樣式和連接樣式等屬性。畫筆的樣式style()定義了線的樣式。畫刷brush()用於填充畫筆所繪制的線條。筆帽樣式capStyle()定義了使用QPainter繪制的線的末端;連接樣式joinStyle()則定義了兩條線如何連接起來。畫筆寬度width()widthF()定義了畫筆的寬。注意,不存在寬度為 0 的線。假設你設置 width 為 0,QPainter依然會繪制出一條線,而這個線的寬度為 1 像素。也就是說,畫筆寬度通常至少是 1 像素。

這麼多參數既可以在構造時指定,也可以使用 set 函數指定,完全取決於你的習慣,例如:

1 QPainter painter(this);
2 QPen pen(Qt::green, 3, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin);
3 painter.setPen(pen);

等價於

 1 QPainter painter(this);
 2 QPen pen;  // creates a default pen
 3  
 4 pen.setStyle(Qt::DashDotLine);
 5 pen.setWidth(3);
 6 pen.setBrush(Qt::green);
 7 pen.setCapStyle(Qt::RoundCap);
 8 pen.setJoinStyle(Qt::RoundJoin);
 9  
10 painter.setPen(pen);

 

使用構造函數的優點是代碼較短,但是參數含義不明確;使用 set 函數則正好反過來。

默認的畫筆屬性是純黑色,0 像素,方形筆帽(Qt::SquareCap),斜面型連接(Qt::BevelJoin)。

下面是畫筆樣式的示例:

 

你也可以使用setDashPattern()函數自定義樣式,例如如下代碼片段:

1  QPen pen;
2  QVector<qreal> dashes;
3  qreal space = 4;
4  
5  dashes << 1 << space << 3 << space << 9 << space
6         << 27 << space << 9 << space;
7  
8  pen.setDashPattern(dashes);

 

筆帽定義了畫筆末端的樣式,例如:

 

他們之間的區別是,Qt::SquareCap是一種包含了最後一個點的方形端點,使用半個線寬覆蓋;Qt::FlatCap不包含最後一個點;Qt::RoundCap是包含最後一個點的圓形端點。具體可以參考下面的示例(出自《C++ GUI Programming with Qt 4, 2nd Edition》):

 

連接樣式定義了兩條線連接時的樣式,例如:

 

 

同樣,可以參考下面圖示來理解這幾種連接樣式的細節(出自《C++ GUI Programming with Qt 4, 2nd Edition》):

 

注意,我們前面說了,QPainter也是一個狀態機,這裡我們所說的這些屬性都是處於這個狀態機之中的,因此,我們應該記得是否要將其保存下來或者是重新構建。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved