Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕上和绘图·设备上进行绘制,主要基于QPainter、QPainterDevice和QPainterEngine这3个类。QPainter执行绘图操作,QPainterDevice提供绘图设备,是一个二维空间的抽象,QPainterEngine提供一些接口。QPainter可以绘制一切简单的图形,从简单的一条直线到任何复杂的图形。QPainter类可以在一切继承QPainterDevice的子类上进行绘制操作。

Qt 绘图系统定义了两个绘制时使用的关键属性:画刷QBrush和画笔QPen

QBrush,用于填充;

QPen,用于绘制轮廓线。

重绘事件的处理函数 :paintEvent()

基础部件类Qwidget提供的paintEvent函数,是纯虚函数;继承它的子类想用它,必须重新实现它。下列三种情况会发生重绘事件:

a)当窗口部件第一次显示时,系统会自动产生一个绘图事件;
b)repaint()与update()函数被调用时;
c)当窗口部件被其他部件遮挡,然后又再次显示出来时,就会对隐藏的区域产生一个重绘事件。
d) 重新调整窗口大小时。

QBrush 定义了 QPainter 的填充模式(style),具有样式、颜色(QColor)、渐变(QGradient)以及纹理(QPximap)等属性。

画刷的style()定义了填充的样式,使用Qt::BrushStyle枚举,默认值是Qt::NoBrush,也就是不进行任何填充。我们可以从下面的图示中看到各种填充样式的区别:

画刷的color()定义了填充模式的颜色。这个颜色可以是 Qt 预定义的颜色常量,也就是Qt::GlobalColor,也可以是任意QColor对象。

画刷的gradient()定义了渐变填充。这个属性只有在样式是Qt::LinearGradientPatternQt::RadialGradientPattern或者Qt::ConicalGradientPattern之一时才有效。渐变可以由QGradient对象表示。Qt 提供了三种渐变:QLinearGradientQConicalGradientQRadialGradient,它们都是QGradient的子类。我们可以使用如下代码片段来定义一个渐变的画刷:

QRadialGradient gradient(50, 50, 50, 50, 50);
gradient.setColorAt(0, QColor::fromRgbF(0, 1, 0, 1));
gradient.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0));QBrush brush(gradient);

渐变填充

(1)线性渐变

(2)辐射渐变

QRadialGradient::QRadialGradient ( const QPointF & center, qreal radius, const QPointF & focalPoint )
Constructs a radial gradient with the given center, radius and focalPoint.
需要指定圆心center和半径radius,这样就可以确定一个圆,然后再指定一个焦点focalPoint;焦点的位置为0, 圆环的位置为1,然后在焦点和圆环之间插入颜色。同样可以使用setspread()指定扩散方式。

QConicalGradient conicalGradient(QPointF(350, 190), 60);
conicalGradient.setColorAt(0.2, Qt::cyan);
conicalGradient.setColorAt(0.9, Qt::black);
painter.setBrush(conicalGradient);
painter.drawEllipse(QPointF(350, 190), 50, 50);

(3)锥形渐变

QConicalGradient::QConicalGradient ( const QPointF & center, qreal angle )
Constructs a conical gradient with the given center, starting the interpolation at the given angle. The angle must be specified in degrees between 0 and 360.
需要指定一个中心点和一个角度,角度在0到360度之间,沿逆时针从给定的角度开始环绕中心点插入颜色。

QConicalGradient conicalGradient(QPointF(350, 190), 60);
conicalGradient.setColorAt(0.2, Qt::cyan);
conicalGradient.setColorAt(0.9, Qt::black);
painter.setBrush(conicalGradient);
painter.drawEllipse(QPointF(350, 190), 50, 50);

当画刷样式是 Qt::TexturePattern时,texture()定义了用于填充的纹理。注意,即使你没有设置样式为Qt::TexturePattern,当你调用setTexture()函数时,QBrush会自动将style()设置为Qt::TexturePattern

QPen定义了用于QPainter应该怎样画线或者轮廓线。画笔具有样式、宽度、画刷、笔帽样式和连接样式等属性。画笔的样式style()定义了线的样式。画刷brush()用于填充画笔所绘制的线条。笔帽样式capStyle()定义了使用QPainter绘制的线的末端;连接样式joinStyle()则定义了两条线如何连接起来。画笔宽度width()widthF()定义了画笔的宽。注意,不存在宽度为 0 的线。假设你设置 width 为 0,QPainter依然会绘制出一条线,而这个线的宽度为 1 像素。也就是说,画笔宽度通常至少是 1 像素。

这么多参数既可以在构造时指定,也可以使用 set 函数指定,完全取决于你的习惯,例如:

QPainter painter(this);
QPen pen(Qt::green, 3, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin);
painter.setPen(pen);

等价于

QPainter painter(this);
QPen pen;  // creates a default penpen.setStyle(Qt::DashDotLine);
pen.setWidth(3);
pen.setBrush(Qt::green);
pen.setCapStyle(Qt::RoundCap);
pen.setJoinStyle(Qt::RoundJoin);painter.setPen(pen);

使用构造函数的优点是代码较短,但是参数含义不明确;使用 set 函数则正好反过来。

默认的画笔属性是纯黑色,0 像素,方形笔帽(Qt::SquareCap),斜面型连接(Qt::BevelJoin)。

下面是画笔样式的示例:

你也可以使用setDashPattern()函数自定义样式,例如如下代码片段:

QPen pen;
QVector<qreal> dashes;
qreal space = 4;dashes << 1 << space << 3 << space << 9 << space<< 27 << space << 9 << space;pen.setDashPattern(dashes);

笔帽定义了画笔末端的样式,例如:

他们之间的区别是,Qt::SquareCap是一种包含了最后一个点的方形端点,使用半个线宽覆盖;Qt::FlatCap不包含最后一个点;Qt::RoundCap是包含最后一个点的圆形端点。具体可以参考下面的示例(出自《C++ GUI Programming with Qt 4, 2nd Edition》):

连接样式定义了两条线连接时的样式,例如:

同样,可以参考下面图示来理解这几种连接样式的细节(出自《C++ GUI Programming with Qt 4, 2nd Edition》):

QPainter也是一个状态机,这里我们所说的这些属性都是处于这个状态机之中的,因此,我们应该记得是否要将其保存下来或者是重新构建。

参考自:https://www.devbean.net/2012/11/qt-study-road-2-brush-pen/

https://blog.csdn.net/lpp0900320123/article/details/25246873

QPainter 画笔(QPen)和画刷(QBrush)相关推荐

  1. Qt / QPainter、QPen、QBrush 如何理解

    之前一直不是很理解上述三个类,直到看到了一篇博客,真的是茅塞顿开啊!下面是该博客的部分内容: 零.介绍 QPen 是画笔,用来绘制图形的轮廓线,以及定义轮廓线的颜色.样式和属性: QBrush 是画刷 ...

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

    QPen是画笔,用来绘制图形的轮廓线,以及定义轮廓线的颜色.样式和属性: QBrush是画刷,用来填充封闭图形,以及定义填充的颜色.样式和属性: QPainter是画家,他要使用画笔QPen和画刷QB ...

  3. win32 7.2 绘制图形 画笔和画刷

    "画笔和画刷"的介绍: GDI 中的绘画函数有 3 大类:画点.画线和画填充区域.对于photoshop之类的,一定知道,画线需要画笔,画填充区域需要画刷. GDI 同样也有画刷画 ...

  4. Python Qt GUI设计:QPainter、QPen、QBrush和QPixmap窗口绘图类(基础篇—17)

    目录 1.QPainter绘图类 2.QPen绘图类 3.QBrush绘图类 4.QPixmap绘图类 本篇博文主要介绍如何实现在窗口中绘图,在 PyQt5中,一般可以通过QPainter.QPen. ...

  5. 从零开始学Pyqt5之【控件介绍】(15):绘图类控件QPainter、QPen、QBrush、QPixMap

    从零开始学Pyqt5之[控件介绍](15):绘图类控件QPainter.QPen.QBrush.QPixMap QPainter控件 QPainter控件的作用 QPainter控件常用方法 QPai ...

  6. QT基础之一文介绍QPainter绘制基础图形(画笔画刷设置,填充铺展渐变效果)

    更多参见 QT基础与实例应用目录 代码链接 GitHub链接 :QPainterSimpleExample 介绍 结合实例介绍如何利用QPainter绘制各种图形,可绘制不同形状,使用不同画笔颜色.画 ...

  7. MFC画图(画线、画矩形、画刷画笔的使用)

    绘制任意线条: 1.创建基于单文档工程:Draw CDrawView类中添加成员变量: CPoint m_ptOrigin; BOOL m_bDraw; 2.CDrawView()中初始化: m_pt ...

  8. MFC——画笔和画刷

    MFC--画笔和画刷 一.画笔 1.创建画笔对象 MFC 中可以使用CPen创建画笔对象,其构造函数如下: CPen(int nPenStyle, //指定画笔样式int nWidth, //指定画笔 ...

  9. 画笔和画刷的种类和使用方法

    画笔的使用和上一章的字体类似,首先用CreatePen()函数创建一个画笔对象,然后与设备文本绑定,同时得到旧的画笔.用完后删除新画笔,并且恢复旧画笔.画笔的种类有7种,参照下表及下面的例子. 值 说 ...

最新文章

  1. 成本VS用户体验, 服务台互动语音应答(IVR)介绍
  2. According to TLD or attribute directive in tag file, attribute value does not accept any expressions
  3. python进程数上限_python – 使用具有最大同时进程数的multipr...
  4. 到国外使用wifi悠着点防止天价帐单
  5. python全栈学习--day12(函数高级应用-带参数的装饰器,多个装饰器装饰一个函数)...
  6. 程序员,35岁是职业发展的转折点 (1)
  7. ibm mq qname java_IBMMQ 从队列获取消息并将消息发送到特定主题上面
  8. 今日头条反省整改;微信QQ封杀短视频;雷军10亿赌约将见分晓| CSDN极客头条
  9. QT学习之解决QT中QIcon图标不显示的问题
  10. 第三章:数组[5常见算法]--[6反转]
  11. 学习笔记:微波遥感反演土壤水分——理论模型和经验模型(1)
  12. 2020语数外百度网盘小学全集下载
  13. 网鼎杯2020 玄武组部分writeup
  14. GPU深度报告,三大巨头,十四个国内玩家一文看懂【物联网智商精选】
  15. 去商场淘打折商品时,计算打折以后的价钱是件颇费脑子的事情。例如原价 ¥988,标明打 7 折,则折扣价应该是 ¥988 x 70% = ¥691.60。本题就请你写个程序替客户计算折扣价。
  16. [CTF]CTFSHOW文件包含练习笔记
  17. Okhttp上传图片
  18. day3-作业(18-23)(java泛型总结一)
  19. document打印
  20. 最新全国姓名报告出炉!

热门文章

  1. 自媒体数据运营saas_向媒体宣传您的SaaS
  2. 【认知觉醒:开启自我改变的原动力】
  3. 手机端自适应表格table样式如何写
  4. OllyDbg逆向破解入门攻略?拿来吧你!
  5. 阿里云边缘云场景化商业实践
  6. 关于搭建FTP服务器
  7. 批量修正字幕乱码(powershell)
  8. Peewee基本使用
  9. 该怎么回答面试官问“你有什么优缺点?”
  10. NB-IoT和eMTC对比