概述
Qt
的繪圖系統(tǒng)可以使用相同的API
在屏幕和打印設(shè)備上進(jìn)行繪圖,并且主要基于QPainter
, QPaintDevice
和QPaintEngine
類。QPainter
用于執(zhí)行繪圖操作,QPaintDevice
是一個(gè)二維空間的抽象,可以使用QPainter
在其上繪制,QPaintEngine
提供了QPainter
用于在不同類型的設(shè)備上繪制的接口。QPaintEngine
類在QPainter
和QPaintDevice
內(nèi)部使用,并且對(duì)應(yīng)用程序程序員是隱藏的,除非他們創(chuàng)建自己的設(shè)備類型。
這種方法的主要好處是,所有的繪制都遵循相同的繪制方式,從而很容易添加對(duì)新特性的支持,并為不支持的特性提供默認(rèn)實(shí)現(xiàn)。
以下類為QPainter
繪制提供了支持:
類
描述
QBitmap
單色(1位深度)像素圖
QBrush
定義由QPainter繪制的形狀的填充模式
QColor
基于RGB, HSV或CMYK值的顏色
QColormap
將與設(shè)備無關(guān)的QColors映射到與設(shè)備相關(guān)的像素值
QConicalGradient
與QBrush結(jié)合使用,指定錐形梯度刷
QFont
指定用于繪制文本的字體
QFontMetrics
字體度量信息
QFontMetricsF
字體度量信息
QGenericMatrix
模板類,表示有N列和M行的NxM變換矩陣
QGradient
與QBrush結(jié)合使用來指定漸變填充
QIcon
不同模式和狀態(tài)下的可伸縮圖標(biāo)
QIconEngine
QIcon渲染器的抽象基類
QImage
獨(dú)立于硬件的圖像表示,允許直接訪問像素?cái)?shù)據(jù),并且可以用作繪畫設(shè)備
QImageReader
格式獨(dú)立的接口,讀取圖像從文件或其他設(shè)備
QImageWriter
用于將圖像寫入文件或其他設(shè)備的格式獨(dú)立接口
QLine
二維矢量采用整數(shù)精度
QLineF
二維矢量使用浮點(diǎn)精度
QLinearGradient
與QBrush結(jié)合使用,指定線性梯度刷
QMargins
定義矩形的四個(gè)邊距
QMarginsF
定義矩形的四個(gè)邊距
QPagedPaintDevice
表示支持多個(gè)頁面的繪圖設(shè)備
QPaintDevice
可以用QPainter繪制的對(duì)象的基類
QPaintEngine
QPainter如何在給定平臺(tái)上繪制給定設(shè)備的抽象定義
QPainter
在小部件和其他繪制設(shè)備上執(zhí)行低級(jí)繪制
QPainterPath
用于繪制操作的容器,使圖形形狀能夠被構(gòu)造和重用
QPainterPathStroker
用于為給定的畫家路徑生成可填充的輪廓
QPdfWriter
類生成可用作繪圖設(shè)備的pdf
QPen
定義QPainter應(yīng)該如何繪制形狀的線條和輪廓
QPixmap
可以用作繪畫設(shè)備的屏幕外圖像表示
QPlatformFontDatabase
可以自定義字體的發(fā)現(xiàn)方式和呈現(xiàn)方式
QPoint
使用整數(shù)精度在平面上定義一個(gè)點(diǎn)
QPointF
使用浮點(diǎn)精度在平面上定義一個(gè)點(diǎn)
QPolygon
向量點(diǎn)使用整數(shù)精度
QPolygonF
向量點(diǎn)使用浮點(diǎn)精度
QRadialGradient
與QBrush結(jié)合使用,指定徑向梯度刷
QRect
使用整數(shù)精度在平面上定義一個(gè)矩形
QRectF
使用浮點(diǎn)精度在平面中定義一個(gè)矩形
QRegion
指定繪圖器的剪輯區(qū)域
QSize
使用整數(shù)點(diǎn)精度定義二維對(duì)象的大小
QSizeF
使用浮點(diǎn)精度定義二維對(duì)象的大小
QStylePainter
用于在小部件內(nèi)繪制QStyle元素的方便類
QSupportedWritingSystems
在使用內(nèi)部Qt字體數(shù)據(jù)庫注冊(cè)字體時(shí)使用
QSvgGenerator
用于創(chuàng)建SVG繪圖的繪圖設(shè)備
QSvgRenderer
用于將SVG文件的內(nèi)容繪制到繪圖設(shè)備上
QSvgWidget
小部件,用于顯示可縮放矢量圖形(SVG)文件的內(nèi)容
QTransform
指定坐標(biāo)系統(tǒng)的2D轉(zhuǎn)換
QVector2D
表示二維空間中的向量或頂點(diǎn)
創(chuàng)建繪畫設(shè)備
QPaintDevice類
是可以繪制對(duì)象的基類,也就是說,QPainter
可以在任何QPaintDevice子類
上繪制。QPaintDevice
的繪圖功能是由QWidget
、QImage
、QPixmap
、QPicture
、QPrinter
和QOpenGLPaintDevice
實(shí)現(xiàn)的。
Widget
QWidget
類是Qt Widgets
模塊中用戶界面元素的基類。它接收來自窗口系統(tǒng)的鼠標(biāo)、鍵盤和其他事件,并在屏幕上描繪自己的表示。
Image
QImage
類提供了一個(gè)獨(dú)立于硬件的圖像表示,它是為I/O和直接的像素訪問和操作而設(shè)計(jì)和優(yōu)化的。QImage
支持多種圖像格式,包括單色,8位,32位和alpha混合圖像。
使用QImage
作為繪圖設(shè)備的一個(gè)優(yōu)點(diǎn)是,它可以以與平臺(tái)無關(guān)的方式保證任何繪圖操作的像素準(zhǔn)確性。另一個(gè)好處是,繪制可以在當(dāng)前GUI線程之外的另一個(gè)線程中執(zhí)行。
Pixmap
QPixmap
類是一個(gè)屏幕外的圖像表示,它被設(shè)計(jì)和優(yōu)化為在屏幕上顯示圖像。與QImage
不同,像素圖中的像素?cái)?shù)據(jù)是內(nèi)部的,由底層窗口系統(tǒng)管理,即像素只能通過QPainter
函數(shù)或?qū)?code style="background-color: rgb(231, 243, 237); padding: 1px 3px; border-radius: 4px; overflow-wrap: break-word; text-indent: 0px; display: inline-block;">QPixmap轉(zhuǎn)換為QImage
來訪問。
為了使用QPixmap
優(yōu)化繪圖,Qt
提供了QPixmapCache類
,它可以用于存儲(chǔ)生成昂貴的臨時(shí)像素圖,而不會(huì)使用超過緩存限制的存儲(chǔ)空間。Qt
還提供了QBitmap
便利類,繼承了QPixmap
。QBitmap
保證單色(1位深度)像素圖,主要用于創(chuàng)建自定義QCursor
和QBrush
對(duì)象,構(gòu)造QRegion
對(duì)象。
OpenGL
繪制設(shè)備
如前所述,Qt提供了一些類,使在Qt應(yīng)用程序中使用OpenGL
變得很容易。例如,QOpenGLPaintDevice
啟用OpenGL API
來PictureQPicture
類是一個(gè)記錄和回放QPainter
命令的繪圖設(shè)備。圖片以平臺(tái)無關(guān)的格式將畫工命令序列化到IO設(shè)備。QPicture
也是獨(dú)立于分辨率的,即一個(gè)QPicture
可以顯示在不同的設(shè)備上(例如svg, pdf, ps,打印機(jī)和屏幕),看起來是一樣的。
Qt提供了QPicture::load()
和QPicture::save()
函數(shù)以及用于加載和保存圖片的流操作符。
Custom Backends
可以通過派生QPaintDevice
類并重新實(shí)現(xiàn)虛擬QPaintDevice:: paintenengine()
函數(shù)來實(shí)現(xiàn)對(duì)新后端的支持,以告訴QPainter
應(yīng)該使用哪個(gè)繪制引擎在這個(gè)特定的設(shè)備上繪制。要真正能夠在設(shè)備上繪圖,這個(gè)繪圖引擎必須是從qpaintenengine
類派生出來的自定義繪圖引擎。
繪制
QPainter
提供了高度優(yōu)化的功能,以完成大多數(shù)繪圖GUI程序所需的功能。它可以繪制從簡單的圖形基元(由QPoint, QLine, QRect, QRegion和QPolygon類表示)到復(fù)雜形狀(如矢量路徑)的一切。在Qt矢量路徑是由QPainterPath類
表示的。QPainterPath
為繪制操作提供了一個(gè)容器,使圖形形狀能夠被構(gòu)造和重用。
QPainterPath
painter
路徑是由線條和曲線組成的對(duì)象。例如,矩形由直線組成,橢圓由曲線組成。
與普通繪圖操作相比,繪制路徑的主要優(yōu)勢(shì)在于,復(fù)雜的形狀只需要?jiǎng)?chuàng)建一次;然后只需調(diào)用QPainter::drawPath()
函數(shù)就可以多次繪制它們。QPainterPath
對(duì)象可用于填充、勾勒和裁剪。要為給定的painter
路徑生成可填充的輪廓,可以使用QPainterPathStroker
類。
線條和輪廓是使用QPen類
繪制的。pen
由其樣式(即線條類型)、寬度、筆刷、如何繪制端點(diǎn)(cap-style)以及如何繪制兩條連接線之間的連接(join-style)來定義。pen
的筆刷是一個(gè)QBrush
對(duì)象,用來填充pen
生成的筆畫,也就是說,QBrush類
定義了填充模式。QPainter
還可以繪制對(duì)齊的文本和像素圖。
繪制文本時(shí),使用QFont類
指定字體。Qt將使用具有指定屬性的字體,或者如果沒有匹配的字體存在,Qt將使用最接近匹配的已安裝字體。實(shí)際使用的字體屬性可以使用QFontInfo
類檢索。此外,QFontMetrics類
提供字體度量,QFontDatabase類
提供有關(guān)底層窗口系統(tǒng)中可用字體的信息。
通常,QPainter
在“自然”坐標(biāo)系中繪制,但它能夠使用QTransform類
執(zhí)行視圖和世界坐標(biāo)系轉(zhuǎn)換。
反鋸齒繪制
繪制時(shí),像素渲染由QPainter::Antialiasing
渲染提示控制。QPainter::RenderHint
枚舉用于指定QPainter
的標(biāo)志,這些標(biāo)志可能被任何給定的引擎尊重,也可能不被尊重。QPainter::Antialiasing
值表示引擎應(yīng)該盡可能地消除原語的邊緣,即通過使用不同的顏色強(qiáng)度平滑邊緣。
基本圖形繪制、填充
繪制線
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter p(this);
p.drawLine(50, 50, 100, 150);
}
或者,創(chuàng)建時(shí)不指定繪制設(shè)備,在begin()函數(shù)中設(shè)置,end時(shí)結(jié)束繪制。
QPainter p;
p.begin(this);
p.drawLine(50, 50, 100, 150);
p.end();
繪制圓弧
繪制由給定矩形、startAngle和spanAngle定義的圓弧。
起始角和伸縮角必須以1/16度指定,即一個(gè)完整的圓等于5760(16 * 360)。角度的正值表示逆時(shí)針方向,負(fù)值表示順時(shí)針方向。零度在3點(diǎn)鐘方位。
QPainter p;
p.begin(this);
QRectF rectangle(10.0, 20.0, 80.0, 60.0);
int startAngle = 30 * 16;
int spanAngle = 120 * 16;
p.drawArc(rectangle, startAngle, spanAngle);
p.end();
繪制弦
繪制由給定矩形、startAngle和spanAngle定義的弦。弦被當(dāng)前的筆刷()填充。
起始角和伸縮角必須以1/16度指定,即一個(gè)完整的圓等于5760(16 * 360)。角度的正值表示逆時(shí)針方向,負(fù)值表示順時(shí)針方向。零度在3點(diǎn)鐘方位。
QPainter p;
p.begin(this);
QRectF rectangle(10.0, 20.0, 80.0, 60.0);
int startAngle = 30 * 16;
int spanAngle = 120 * 16;
p.drawChord(rectangle, startAngle, spanAngle);
p.end();
繪制凸多邊形
QPainter p;
p.begin(this);
static const QPointF points[4] = {
QPointF(40.0, 110.0),
QPointF(50.0, 40.0),
QPointF(110.0, 70.0),
QPointF(120.0, 100.0)
};
p.drawConvexPolygon(points, 4);
p.end();
繪制橢圓
QPainter p;
p.begin(this);
QRectF rectangle(100.0, 50.0, 80.0, 60.0);
p.drawEllipse(rectangle);
p.end();
如果寬,高一樣,就是圓。
繪制扇形
QPainter p;
p.begin(this);
QRectF rectangle(100.0, 50.0, 160.0, 120.0);
int startAngle = 30 * 16;
int spanAngle = 120 * 16;
p.drawPie(rectangle, startAngle, spanAngle);
p.end();
填充
除此之外,還可以使用畫筆及畫刷進(jìn)行繪制和填充繪制多邊形
QPainter p;
p.begin(this);
QPen pen(QBrush(Qt::gray), 2, Qt::DashLine, Qt::FlatCap, Qt::RoundJoin);
p.setPen(pen);
p.setBrush(Qt::green);
static const QPointF points[4] = {
QPointF(40.0, 110.0),
QPointF(50.0, 40.0),
QPointF(110.0, 70.0),
QPointF(120.0, 100.0)
};
p.drawPolygon(points, 4);
p.end();
繪制圓角矩形
QPainter p;
p.begin(this);
QPen pen(QBrush(Qt::black), 2, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin);
p.setPen(pen);
p.setBrush(Qt::lightGray);
QRectF rectangle(10.0, 20.0, 80.0, 60.0);
p.drawRoundedRect(rectangle, 20.0, 15.0);
p.end();
漸變填充
使用畫刷還可以進(jìn)行漸變填充。
漸變有三種:
- 線性漸變:QLinearGradient
- 輻射漸變:QRadialGradient
- 錐形漸變:QConicalGradient
繪制矩形
QPainter p;
p.begin(this);
QPen pen(QBrush(Qt::black), 2, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin);
p.setPen(pen);
QLinearGradient linearGrad(QPointF(100, 100), QPointF(200, 200));
linearGrad.setColorAt(0, Qt::black);
linearGrad.setColorAt(1, Qt::white);
p.setBrush(linearGrad);
QRectF rectangle(100.0, 100.0, 100.0, 100.0);
p.drawRoundedRect(rectangle, 20.0, 15.0);
p.end();
結(jié)論
人生就是這樣,有歡笑也有淚水。一部分人主要負(fù)責(zé)歡笑,另一部分人主要負(fù)責(zé)淚水
。