QPainter、QPen、QBrush,绘图、填充、渐变等使用方法
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);
}
QPainter、QPen、QBrush,绘图、填充、渐变等使用方法相关推荐
- pyqt5讲解5:窗口绘图类控件QPainter,QPen,QBrush,QPixmap
1.QPainter 常用方法 方法 描述 begin() 开始在目标设备上绘制 drawArc() 在起始角度和最终角度之间画弧 drawEliipse() 在一个矩形内画一个椭圆 drawLine ...
- 【Qt】2D绘图之渐变填充
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 线性渐变 04. 辐射渐变 05. 锥形渐变 06. 附录 01. 概述 在画刷中可以使用渐变填充.QGradient类就 ...
- 【QT】QT从零入门教程(十三):QT画笔工具QPainter (双缓冲绘图)
QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage.QOpenGLPaintDevice.QWidget 和QPaintDevice 显示图形(线.形状.渐变等). ...
- Qt之图形(QPainter的基本绘图)
简述 Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice 和 QPaintEngine 这三个类. QPai ...
- Qt 之图形(QPainter 的基本绘图)
简述 Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice 和 QPaintEngine 这三个类. QPai ...
- HTML5图片怎么添加渐变,HTML5 canvas图和实现填充渐变形状
本篇教程探讨了HTML5 canvas图和实现填充渐变形状,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < html PUBLIC "-//W3C/ ...
- Revit中绘图填充与模型填充的区别
一.Revit中绘图填充与模型填充的区别 在设完楼板的表现填充图案以后,在三潍视图中旋转模型,图案不跟随楼板旋转如图1所示.这种情况怎么解决? 遇到这种情况我们要知道绘图填充与模型填充的区别. (1) ...
- 说说在 Canvas 中如何填充渐变颜色
渐变颜色填充方式有两种:线性或径向. 线性渐变填充会创建一个水平 . 垂直或者对角线的填充图案. 径向渐变填充会自中心点创建一个放射状填充图案. 1 线性渐变 1.1 线性水平渐变 (1)基本形状 S ...
- android编程绘图,Android编程绘图操作之弧形绘制方法示例
本文实例讲述了Android编程绘图操作之弧形绘制方法.分享给大家供大家参考,具体如下: /** * 绘制弧形图案 * @description: * @author ldm * @date 2016 ...
- ML之FE:特征工程中数据缺失值填充的简介、方法、全部代码实现之详细攻略
ML之FE:特征工程中数据缺失值填充的简介.方法.全部代码实现之详细攻略 目录 特征工程中数据缺失值填充的简介.方法.经典案例
最新文章
- 客快物流大数据项目(二十二):Docker环境中安装软件
- 使用dom4j解析XML例子
- gperf学习笔记(二)
- 2017python学习的第五天:模块
- 在 windows 命令行下快速检测与排除网络故障
- 《软件工艺师:专业、务实、自豪》一2.8 小结
- 护肤产生共鸣_通过以人为本的设计编织共鸣的20个指针
- zynq网络时钟控制寄存器_ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断...
- springboot启动后卡住 无日志的几种情况
- 【Elasticsearch】Elasticsearch 热点线程 hot_threads
- java hasnextdouble_scanner.nextInt()与scanner.nextDouble
- 清华大学操作系统OS学习(十四)——文件系统和文件描述符
- Industrial Style Transfer with Large-scale Geometric Warping and Content Preservation论文解读
- ps4微软服务器地址,PSN服务更新 终于可以在PC上玩PS4游戏了!
- 矩阵快速幂求斐波那契数列 poj3070
- 74HC573锁存器的原理和使用
- 智遥工作流导出Excel分析
- 搜狗输入法英文字母间隔大
- 智能路由器市场份额增长态势不减 线下渠道或将成为下一个爆发点
- AI综述专栏 | 朱松纯教授浅谈人工智能:现状、任务、构架与统一
热门文章
- 【多标签文本分类】MSML-BERT模型的层级多标签文本分类方法研究
- 将Twitter4j与Scala结合使用以执行用户操作
- 电信4g网络问题及恢复方案
- android 微信表情雨,2017新年微信表情雨大召唤术-微信彩蛋表情雨2017预约 _5577安卓网...
- Java Service Wrapper 发布Java程序为Windows服务
- 文本diff算法Patience Diff
- 分布式一致性协议Raft,以及难搞的Paxos
- 自己动手搭建一个简单的静态资源服务器
- echarts拓扑图一些功能实现
- java 最后的异常_关于java:异常处理尝试没有catch,但最后