QPainter、QPen、QBrush,绘图、填充、渐变等使用方法

您所在的位置:网站首页 色彩画渐变色怎么画图片简单 QPainter、QPen、QBrush,绘图、填充、渐变等使用方法

QPainter、QPen、QBrush,绘图、填充、渐变等使用方法

2024-07-14 12:58| 来源: 网络整理| 查看: 265

QPen是画笔,用来绘制图形的轮廓线,以及定义轮廓线的颜色、样式和属性; QBrush是画刷,用来填充封闭图形,以及定义填充的颜色、样式和属性; QPainter是画家,他要使用画笔QPen和画刷QBrush,在画布(QPaintDevice)上画文字、图形、图片等。

可以充当画布(QPaintDevice)的类(其子类)有:QWidget,QImage, QOpenGLPaintDevice, QPagedPaintDevice, QPaintDeviceWindow, QPicture, and QPixmap。 这么多类型的画布中,QWidget和QPixmap最常用。

1、QPen

画笔定义了轮廓线的颜色、样式和属性,所谓样式和属性就是: ① 轮廓线的线型,如实线、点划线、双点划线、虚线等,当然,虚线、点划线的间距属性等也都可以设置。 ② 轮廓线端点的样式,如圆形、方形等。 ③ 轮廓线拐点的样式,如尖角、圆角等。

以上3种样式分别见以下三图: 

 

2、QBrush

画刷定义了对封闭区域填充的颜色、样式。

  

设置画刷的类型,一般直接在构造函数形参设置。上图中点状、网状、斜线状等基本填充方式,可通过形参Qt::BrushStyle style设置、渐变填充可通过形参const QGradient &gradient设置、纹理(图片)填充可通过形参const QPixmap &pixmap或者const QImage &image设置。

基本填充方式没啥好说的,给构造函数传入一个枚举就完了;图片填充方式也很简单,就是设置一张图片,然后设置填充方式如拉伸、重复等;渐变填充有3种,线性、辐射、锥形,使用步骤直接百度《.QT-渐变之QLinearGradient、 QConicalGradient、QRadialGradient》 《QT 学习记录:渐变-QLinearGradient,QRadialGradient,QConicalGradient)》

注意:渐变会同时作用于R/G/B/A四个通道,因此我们甚至可以做出由透明变得逐步不透明的效果,下文有例子。

 

3、示例代码

以下代码的功能是: 绘制3个圆圈,无填充; 一个小飞机,红色轮廓,浅红色填充; 横竖两条中心线; 背景为从中心向边沿,绿白渐变,且中心为绿色半透明、边沿不透明。 2个文字;

 

下面是效果图,可以看到,中心是半透明的,透过代码生成的图片,可以看到后面的内容,如下下图1、图2。稍作修改即可实现中心不透明,边沿逐步透明,如下图3。

      

 

//本例展示如何在QWidget的子类上画图 void XXXX::paintEvent(QPaintEvent *event) { QPainter p(this);//画家把本this窗体作为画布。 p.setRenderHints(QPainter::HighQualityAntialiasing | QPainter::Antialiasing | QPainter::TextAntialiasing, true);//抗锯齿以平滑 int xLen = width();//画布大小 int yLen = height(); //step 1:绘制绿色渐变背景 //QRadialGradient(圆形渐变区域中心,渐变区域半径,聚焦点坐标) QRadialGradient gradient(QPointF(100, 100), 100, QPointF(100,100)); gradient.setColorAt(0.5, QColor(170, 255, 127, 255));//浅绿色不透明 gradient.setColorAt(1.0, QColor(170, 255, 127, 0));//浅绿色全透明 p.setPen(QColor(170, 255, 127, 150));//绿色半透明边框 p.setBrush(QBrush(gradient));//渐变画刷 p.drawRect(this->rect()); //step 2:绘制横竖两条中心线 p.setPen(QColor(255, 0, 0, 255)); p.setBrush(QColor(255, 0, 0, 255)); p.drawLine(QPoint(xLen / 2, 0), QPoint(xLen / 2, yLen)); p.drawLine(QPoint(0, xLen/2), QPoint(yLen, xLen/2)); //step 3:绘制3个圆 p.save();//移动或旋转坐标系之前,先备份当前坐标系的设置 p.translate(xLen/2, yLen/2);//平移坐标系原点至 p.setPen(QColor(255, 0, 0, 80)); p.setBrush(QColor(255, 0, 0, 0)); p.drawEllipse(QRect(-xLen/2, -yLen/2, xLen, yLen));//绘制 p.drawEllipse(QRect(-xLen/4, -yLen/4, xLen/2, yLen/2)); p.drawEllipse(QRect(-xLen/8, -yLen/8, xLen/4, yLen/4)); //step 4:用多边形绘制飞机 p.setPen(QColor(255, 0, 0, 255)); p.setBrush(QColor(255, 0, 0, 100)); p.translate(uavPixPos.x(), -uavPixPos.y()); p.rotate(uavYaw); QPoint points[4] = {QPoint(0, -uavSize),QPoint(-uavSize/1.5, uavSize/1.5),QPoint(0,0),QPoint( uavSize/1.5, uavSize/1.5)}; p.drawPolygon(points, 4); p.setPen(QColor(255, 0, 0, 255)); p.setBrush(QColor(255, 0, 0, 255)); p.drawEllipse(QRect(-3, -3, 6, 6)); p.restore(); //step 5:绘制文字 p.setPen(QColor(255, 0, 0, 150)); p.setBrush(QColor(255, 0, 0, 150)); p.drawText(5, yLen/2, "2m"); p.setPen(QColor(255, 0, 0, 150)); p.setBrush(QColor(255, 0, 0, 150)); p.drawText(xLen/4+ 5, yLen/2, "1m"); QWidget::paintEvent(event); }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3