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

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

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);
}

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

  1. pyqt5讲解5:窗口绘图类控件QPainter,QPen,QBrush,QPixmap

    1.QPainter 常用方法 方法 描述 begin() 开始在目标设备上绘制 drawArc() 在起始角度和最终角度之间画弧 drawEliipse() 在一个矩形内画一个椭圆 drawLine ...

  2. 【Qt】2D绘图之渐变填充

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 线性渐变 04. 辐射渐变 05. 锥形渐变 06. 附录 01. 概述 在画刷中可以使用渐变填充.QGradient类就 ...

  3. 【QT】QT从零入门教程(十三):QT画笔工具QPainter (双缓冲绘图)

      QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage.QOpenGLPaintDevice.QWidget 和QPaintDevice 显示图形(线.形状.渐变等). ...

  4. Qt之图形(QPainter的基本绘图)

    简述 Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice 和 QPaintEngine 这三个类. QPai ...

  5. Qt 之图形(QPainter 的基本绘图)

    简述 Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice 和 QPaintEngine 这三个类. QPai ...

  6. HTML5图片怎么添加渐变,HTML5 canvas图和实现填充渐变形状

    本篇教程探讨了HTML5 canvas图和实现填充渐变形状,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < html PUBLIC "-//W3C/ ...

  7. Revit中绘图填充与模型填充的区别

    一.Revit中绘图填充与模型填充的区别 在设完楼板的表现填充图案以后,在三潍视图中旋转模型,图案不跟随楼板旋转如图1所示.这种情况怎么解决? 遇到这种情况我们要知道绘图填充与模型填充的区别. (1) ...

  8. 说说在 Canvas 中如何填充渐变颜色

    渐变颜色填充方式有两种:线性或径向. 线性渐变填充会创建一个水平 . 垂直或者对角线的填充图案. 径向渐变填充会自中心点创建一个放射状填充图案. 1 线性渐变 1.1 线性水平渐变 (1)基本形状 S ...

  9. android编程绘图,Android编程绘图操作之弧形绘制方法示例

    本文实例讲述了Android编程绘图操作之弧形绘制方法.分享给大家供大家参考,具体如下: /** * 绘制弧形图案 * @description: * @author ldm * @date 2016 ...

  10. ML之FE:特征工程中数据缺失值填充的简介、方法、全部代码实现之详细攻略

    ML之FE:特征工程中数据缺失值填充的简介.方法.全部代码实现之详细攻略 目录 特征工程中数据缺失值填充的简介.方法.经典案例

最新文章

  1. 客快物流大数据项目(二十二):Docker环境中安装软件
  2. 使用dom4j解析XML例子
  3. gperf学习笔记(二)
  4. 2017python学习的第五天:模块
  5. 在 windows 命令行下快速检测与排除网络故障
  6. 《软件工艺师:专业、务实、自豪》一2.8 小结
  7. 护肤产生共鸣_通过以人为本的设计编织共鸣的20个指针
  8. zynq网络时钟控制寄存器_ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断...
  9. springboot启动后卡住 无日志的几种情况
  10. 【Elasticsearch】Elasticsearch 热点线程 hot_threads
  11. java hasnextdouble_scanner.nextInt()与scanner.nextDouble
  12. 清华大学操作系统OS学习(十四)——文件系统和文件描述符
  13. Industrial Style Transfer with Large-scale Geometric Warping and Content Preservation论文解读
  14. ps4微软服务器地址,PSN服务更新 终于可以在PC上玩PS4游戏了!
  15. 矩阵快速幂求斐波那契数列 poj3070
  16. 74HC573锁存器的原理和使用
  17. 智遥工作流导出Excel分析
  18. 搜狗输入法英文字母间隔大
  19. 智能路由器市场份额增长态势不减 线下渠道或将成为下一个爆发点
  20. AI综述专栏 | 朱松纯教授浅谈人工智能:现状、任务、构架与统一

热门文章

  1. 【多标签文本分类】MSML-BERT模型的层级多标签文本分类方法研究
  2. 将Twitter4j与Scala结合使用以执行用户操作
  3. 电信4g网络问题及恢复方案
  4. android 微信表情雨,2017新年微信表情雨大召唤术-微信彩蛋表情雨2017预约 _5577安卓网...
  5. Java Service Wrapper 发布Java程序为Windows服务
  6. 文本diff算法Patience Diff
  7. 分布式一致性协议Raft,以及难搞的Paxos
  8. 自己动手搭建一个简单的静态资源服务器
  9. echarts拓扑图一些功能实现
  10. java 最后的异常_关于java:异常处理尝试没有catch,但最后