過去一天沒有接上上章的東西,今天繼續(xù)啊!
首先還是要先把上次的代碼拿上來。
void PaintedWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawLine(80, 100, 650, 500);
painter.setPen(Qt::red);
painter.drawRect(10, 10, 100, 400);
painter.setPen(QPen(Qt::green, 5));
painter.setBrush(Qt::blue);
painter.drawEllipse(50, 150, 400, 200);
}
上次我們說的是 Qt 繪圖相關(guān)的架構(gòu),以及 QPainter 的建立和 drawXXXX 函數(shù)??梢钥吹?,基本上代碼中已經(jīng)設(shè)計(jì)到得函數(shù)還剩下兩個(gè):setPen()和 setBrush()。現(xiàn)在,我們就要把這兩個(gè)函數(shù)講解一下。
Qt 繪圖系統(tǒng)提供了三個(gè)主要的參數(shù)設(shè)置,畫筆(pen)、畫刷(brush)和字體(font)。這里我們要說明的是畫筆和畫刷。
所謂畫筆,是用于繪制線的,比如線段、輪廓線等,都需要使用畫筆繪制。畫筆類即 QPen,可以設(shè)置畫筆的樣式,例如虛線、實(shí)現(xiàn)之類,畫筆的顏色,畫筆的轉(zhuǎn)折點(diǎn)樣式等。畫筆的樣式可以在創(chuàng)建時(shí)指定,也可以由 setStyle()函數(shù)指定。畫筆支持三種主要的樣式:筆帽(cap),結(jié)合點(diǎn)(join)和線形 (line)。這些樣式具體顯示如下(圖片來自 C++ GUI Programming with Qt4, 2nd Edition):
上圖共分成三行:第一行是 Cap 樣式,第二行是 Join 樣式,第三行是 Line 樣式。QPen 允許你使用 setCapStyle()、setJoinStyle()和 setStyle()分別進(jìn)行設(shè)置。具體請(qǐng)參加 API 文檔。
所謂畫刷,主要用來填充封閉的幾何圖形。畫刷主要有兩個(gè)參數(shù)可供設(shè)置:顏色和樣式。當(dāng)然,你也可以使用紋理或者漸變色來填充圖形。請(qǐng)看下面的圖片(圖片出自 Qt API 文檔):
這里給出了不同 style 的畫刷的表現(xiàn)。同畫筆類似,這些樣式也可用通過一個(gè) enum 進(jìn)行設(shè)置。
明白了這些之后我們?cè)賮砜纯次覀兊拇a。首先,我們直接使用 drawLine()函數(shù),由于沒有設(shè)置任何樣式,所以使用的是默認(rèn)的1px,,黑色,solid 樣式畫了一條直線;然后使用 setPen()函數(shù),將畫筆設(shè)置成 Qt::red,即紅色,畫了一個(gè)矩形;最后將畫筆設(shè)置成綠色,5px,畫刷設(shè)置成藍(lán)色,畫了一個(gè)橢圓。這樣便顯示出了我們最終的樣式:
另外要說明一點(diǎn),請(qǐng)注意我們的繪制順序,首先是直線,然后是矩形,最后是橢圓。這樣,因?yàn)闄E圓是最后畫的,因此在最上方。
在我們學(xué)習(xí) OpenGL 的時(shí)候,肯定聽過這么一句話:OpenGL 是一個(gè)狀態(tài)機(jī)。所謂狀態(tài)機(jī),就是說,OpenGL 保存的只是各種狀態(tài)。怎么理解呢?比如,你把顏色設(shè)置成紅色,那么,直到你重新設(shè)置另外的顏色,它的顏色會(huì)一直是紅色。QPainter 也是這樣,它的狀態(tài)不會(huì)自己恢復(fù),除非你使用了各種 set函數(shù)。因此,如果在上面的代碼中,我們?cè)跈E圓繪制之后再畫一個(gè)橢圓,它的樣式還會(huì)是綠色5px 的輪廓和藍(lán)色的填充,除非你顯式地調(diào)用了 set 進(jìn)行更新。這可能是繪圖系統(tǒng)較多的實(shí)現(xiàn)方式,因?yàn)闊o論是OpenGL、QPainter 還是 Java2D,都是這樣實(shí)現(xiàn)的(DirectX 不大清楚)。
本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/194031
更多建議: