QPainter祟绊、QPaintDevice毁渗、QPaintEngine的介紹
QPainter 用來執(zhí)行繪圖操作; QPaintDevice提供繪圖設(shè)備停做,是一個(gè)二維空間的抽象钳踊,可以使用QPainter在其上進(jìn)行繪制衷敌;是所有可以進(jìn)行繪制的基類,其子類有QWidget拓瞪、QPixmap缴罗、QPicture、QImage吴藻、QPainter和QOpenGLPaintDevice等瞒爬。QPaintEngine提供了一些接口,用于QPainter和QPaintDevice內(nèi)部沟堡。使得QPainter可以在不同的設(shè)備上進(jìn)行繪制侧但。
1、繪制與填充
QPainter::QPainter(QPaintDevice *device) 航罗;
QPainter 構(gòu)造中device為繪圖設(shè)備禀横;使用這個(gè)構(gòu)造函數(shù)創(chuàng)建的對象會(huì)立即開始在設(shè)備上進(jìn)行繪制,自動(dòng)繪制掉用begin()函數(shù)粥血,然后在QPainter的析構(gòu)造函數(shù)中調(diào)用end()函數(shù)結(jié)束繪制柏锄。
QPainter中的圖形繪制函數(shù)
* drawLine() 繪制線條
* drawArc() 繪制圓弧
* drawChord() 繪制弦
* drawConvexPolygon() 繪制凸多邊形
* drawEllipse() 繪制橢圓
* drawPie() 繪制扇形
* drawPoint() 繪制點(diǎn)
* drawPolygon() 繪制多邊形
* drawRect() 繪制矩形
* drawRoundedRect() 繪制圓角矩形
2、畫筆
在paintEvent()函數(shù)中繼續(xù)添加如下代碼
QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin); // 創(chuàng)建畫筆
painter.setPen(pen); // 使用畫筆
QRectF rectangle(70.0, 40.0, 80.0, 60.0);
int startAngle = 30 * 16;
int spanAngle = 120 *16;
painter.drawArc(rectangle, startAngle, spanAngle); //繪制圓弧
QPen類為QPainter提供了畫筆來繪制線條和形狀的輪廓复亏,這里使用QPen::QPen(const QBrush& brush, qreal width, Qt::PenStyle style = Qt::SolidLine, Qt::PenCapStyle cap = Qt::SquareCap, Qt::PenJoinStyle join = Qt::BevelJoin);其中幾個(gè)參數(shù)分別是畫刷(為畫筆提供顏色)趾娃,線寬(默認(rèn)為0,一個(gè)像素)缔御、畫筆風(fēng)格(有實(shí)線抬闷、點(diǎn)線等,還有一個(gè)Qt::NoPen值表示不進(jìn)行線條或邊框的繪制,還可以使用setDashPatten()來指定以一個(gè)畫筆風(fēng)格)笤成、畫筆端點(diǎn)風(fēng)格(怎樣定制線條端點(diǎn)的繪制其中Qt::SquareCap風(fēng)格表示線條的終點(diǎn)為方形评架,并延長了線寬的一半)、畫筆連接風(fēng)格(兩條線段的連接炕泳,Qt::BeveJoin 風(fēng)格填充了兩個(gè)線條之間的空卻三角形)纵诞;
也可以使用setBrush()、setWidth()培遵、setStyle()浙芙、setCapStyle()和setJoinStyle()等函數(shù)設(shè)置。
3荤懂、畫刷
在paintEvent()方法中繼續(xù)添加畫刷功能
painter.drawRect(160, 20, 50, 40); //繪制一個(gè)矩形
QBrush brush(QColor(0,0, 255), Qt::dense4Pattern);//創(chuàng)建畫刷
painter.setBrush(brush);// 使用畫刷
painter.drawEllipse(220, 20, 50, 50); // 繪制橢圓
brush.setTexture(QPixmap("../image/bg.png")); // 設(shè)置紋理
painter.setBrush(brush); // 重新使用畫刷
// 繪制多邊形
static const QPointF points[4] = {
QPointF(270.0, 80.0),
QPointF(290.0, 10.0),
QPointF(350.0, 30.0),
QPointF(390.0, 70.0)
};
painter.drawPolygon(points, 4);
QBrush類提供了畫刷來對圖形進(jìn)行填充茁裙,所以QBrush的定義包含了顏色和風(fēng)格(填充模式)塘砸。顏色由QColor類來表示他支持RGB节仿、HSV及CMYK等顏色模型。QColor還支持基于alpha的輪廓和填充(透明效果)掉蔬。
3廊宪、漸變填充
QGradient類和QBrush類一起完成漸變填充。Qt支持3中類型的漸變填充:
- 線性漸變 linear gradient:開始點(diǎn)和結(jié)束點(diǎn)之間填充顏色女轿;
- 輻射漸變 radial gradient :在焦點(diǎn)和環(huán)繞他的圓環(huán)間插入顏色箭启;
- 錐形漸變 Conical gradient:在圓心周圍插入顏色。
//線性漸變
QLinearGradient linearGradient(QPointF(40, 190), QPointF(70, 200));
//insert color
linearGradient.setColorAt(0, Qt::yellow);
linearGradient.setColorAt(0.5, Qt::red);
linearGradient.setColorAt(1, Qt::blue);
// 指定漸變區(qū)域意外的區(qū)域的擴(kuò)散方式
linearGradient.setSpread(QGradient::RepeatSpread);
//使用漸變作為畫刷
painter.setBrush(linearGradient);
painter.drawRect(10, 170, 90, 40);
// 輻射漸變
/*
輻射漸變 QRadialGradient::QradialGradient(const QPointF& center, qreal radius, const QPointF & foacalPoint);
輻射漸變構(gòu)造函數(shù)需要指定圓心center, 半徑radius蛉迹,就可以確定一個(gè)圓傅寡,在指定一個(gè)焦點(diǎn)focalPoint,在焦點(diǎn)和圓環(huán)之間插入顏色
*/
QRadialGradient radialGradient(QPointF(200, 190), 50, QPointF(275, 200));
radialGradient.setColorAt(0, QColor(255, 255, 100, 150);
radialGradient.setColorAt(1, QColor(0, 0, 0, 50);
painter.setBrush(radialGradient);
painter.drawEllipe(QPointF(200, 190), 50, 50);
//錐形漸變
/*
QConicalGradient::QConicalGradient(const QPointF ¢er, qreal angle) ;
錐形漸變的構(gòu)造函數(shù)需要指定center中心點(diǎn)北救,和一個(gè)角度angle(0-360)荐操,然后逆時(shí)針旋轉(zhuǎn),setSpread函數(shù)對于錐形漸變沒有效果珍策。
*/
QConicalGradient conicalGradient(QPointF(350, 190), 60);
conicalGradient.setColorAt(0.2, Qt::cyan);
conicalGradient.setColorAt(0.9, Qt::black);
painter.setBrush(conicalGradient );
painter.drawEllipe(QPointF(400, 190), 50, 50);
//畫筆使用線性漸變來繪制直線和文字
painter.setPen(QPen(linearGradient, 2));
painter.drawLine(0, 280, 100, 280);
painter.drawText(150, 280, tr("helloQt"));