文章目錄
- 前言
- 1. QPainter 繪圖系統
- 1.1 QPainter 與QPaintDevice
- 1.2 paintEvent事件和繪圖區
- 1.3 QPainter 繪圖的主要屬性
- 2. QPen的主要功能
- 3. QBrush的主要功能
- 4. 漸變填充
- 5. QPainter 繪制基本圖形元件
- 5.1 基本圖像元件
- 5.2 QpainterPath的使用
前言
本章所介紹內容基本在《QT從入門到實戰x篇》中對應有介紹,本專欄主要做簡要功能介紹,到實際需要使用的時候再做詳究。
1. QPainter 繪圖系統
1.1 QPainter 與QPaintDevice
Qt 的繪圖系統使用戶可以在屏幕或打印設備上用相同的 API繪圖,繪圖系統基于 QPainter、QPaintDevice和QPaintEngine
類。
QPainter 是用來進行繪圖操作的類,QPaintDevice 是一個可以使用QPainter 進行繪圖的抽象的二維界面,QPaintEngine 給 QPainter 提供在不同設備上繪圖的接口。QPaintEngine 類由 QPainter 和QPaintDevice 內部使用,應用程序一般無需和 QPaintEngine 打交道,除非要創建自己的設備類型。
一般的繪圖設備包括 QWidget、QPixmap、QImage 等,這些繪圖設備為 QPainter 提供一個“畫布”。
1.2 paintEvent事件和繪圖區
QWidget 類及其子類是最常用的繪圖設備,從QWidget 類繼承的類都有 paintEvent()事件
,要在設備上繪圖,只需重定義此事件并編寫響應代碼。創建一個 QPainter 對象獲取繪圖設備的接口,然后就可以在繪圖設備的“畫布”上繪圖了。
在paintEvent()事件里繪圖的基本程序結構是:
void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);//創建與繪圖設備關聯的QPainter對象```//painter在設備的窗口上畫圖
}
首先創建一個屬于本繪圖設備的 QPainter 對象 painter,然后使用這個 painter 在繪圖設備的窗口上畫圖。
QWidget 的繪圖區就是其窗口內部區域。如圖8-1所示是在一個 QWidget 窗口上繪制了一個填充矩形(這個實心矩形及其邊框是程序繪制的圖形,其他直線和文字是為說明而加的),整個窗口內部的矩形區就是QPainter 可以繪圖的區域。
QWidget的內部繪圖區的坐標系統如圖8-1所示,坐標系統的單位是像素。左上角坐標為(0,0),向右是X 軸正方向,向下是 Y 軸正方向,繪圖區的寬度由QWidget::width()函數獲取,高度由 QWidget::height()函數獲取,所以,繪圖區右下角的的點的坐標是(width(),height())。這個坐標系統是 QWidget 繪圖區的局部物理坐標,稱為視口(viewport)坐標。相應的還有邏輯坐標,稱為窗口 (window)坐標
,后面再詳細介紹。
使用QPainter 在QWidget 上繪圖就是在這樣的一個矩形區域里繪圖
1.3 QPainter 繪圖的主要屬性
用 QPainter 在繪圖設備上繪圖,主要是繪制一些基本的圖形元素,包括點、直線、圓形、矩形、曲線、文字等,控制這些繪圖元素特性的主要是 QPainter 的 3 個屬性,分別如下。
-
pen 屬性:是一個 QPen 對象,用于控制線條的顏色、寬度、線型等,如圖 8-1 所示矩形邊框的線條的特性就是由 pen 屬性決定的。
-
brush 屬性:是一個QBrush 對象,用于設置一個區域的填充特性,可以設置填充顏色、填充方式、漸變特性等,還可以采用圖片做材質填充。圖 8-1 中的矩形用黃色填充就是由 brush屬性設置決定的。
-
font 屬性:是一個 QFont 對象,用于繪制文字時,設置文字的字體樣式、大小等屬性。
使用這 3 個屬性基本就控制了繪圖的基本特點,當然還有一些其他的功能結合使用,比如疊加模式、旋轉和縮放等功能。
關于QPainter基本功能實例,請參考書籍。
2. QPen的主要功能
QPen 用于繪圖時對線條進行設置,主要包括線寬、顏色、線型等,表 8-1是 QPen 類的主要接口函數。通常一個設置函數都有一個對應的讀取函數,例如 setColor()用于設置畫筆顏色,對應的讀取畫筆顏色的函數為 color(),表 8-1 僅列出設置函數(省略了函數參數中的 const 關鍵字)。
線條顏色和寬度的設置無需多說,,QPen影響線條特性的另外3 個主要屬性是線條樣式(style).
端點樣式(capStyle) 和連接樣式 (joinStyle)。具體如何影響見書籍。
3. QBrush的主要功能
QBrush 定義了QPainter 繪圖時的填充特性,包括填充顏色、填充樣式、材質填充時的材質圖片等,其主要函數見表 8-2(省略了函數參數中的 const 關鍵字)。
setStyle(Qt::BrushStyle style)函數設置畫刷的樣式,參數是 Qt:BrushStyle style 枚舉類型,該枚舉類型典型的幾種取值見表 8-3,詳細的取值請參考Qt 的幫助文件。
4. 漸變填充
使用漸變填充需要用漸變類的對象作為 Painter 的 brush,有3 個實現漸變填充的類。
QLinearGradient:線性漸變。指定一個起點及其顏色,終點及其顏色,還可以指定中間的某個點的顏色,起點至終點之間的顏色會線性插值計算,得到線性漸變的填充顏色。
QRadialGradient:有簡單輻射漸變和擴展輻射漸變兩種方式。簡單輻射漸變是在一個圓內的一個焦點和一個端點之間生成漸變顏色,擴展輻射漸變是在一個焦點圓和一個中心圓之間生成漸變色。
QConicalGradient:圓錐形漸變,圍繞一個中心點逆時針生成漸變顏色。
具體使用見書籍
5. QPainter 繪制基本圖形元件
5.1 基本圖像元件
QPainter 提供了很多繪制基本圖形的功能,包括點、直線、橢圓、矩形、曲線等,由這些基本的圖形可以構成復雜的圖形。QPainter 中提供的繪制基本圖元的函數見對應章節。每個函數基本上都有多種參數形式,這里只列出函數名,給出了其中一種參數形式的示例代碼,并且假設已經通過以下的代碼獲得了繪圖窗口的 painter、窗口寬度W和高度H。
QPainter painter(this);
int W=this->width); //繪圖區寬度
int H=this->height); //繪圖區高度
同一個函數名的其他參數形式的函數原型可查閱 Qt 的幫助文件。
5.2 QpainterPath的使用
QPainterPath 是一系列繪圖操作的順序集合,便于重復使用。一個 PainterPath 由許多基本的繪圖操作組成,如繪圖點移動、劃線、畫圓、畫矩形等,一個閉合的 PainterPath 是終點和起點連接起來的繪圖路徑。使用QPainterPath 的優點是繪制某些復雜形狀時只需創建一個PainterPath,然后調用 QPainter:drawPath()就可以重復使用。例如繪制一個復雜的星星圖案需要多次調用 lineto()函數,定義一個QPainterPath 類型的變量 path 記錄這些繪制過程,再調用drawPath(path)就可以完成星型圖案的繪制。具體見參考書籍。