QPainter 画笔(QPen)和画刷(QBrush)

2024-09-03 11:18
文章标签 画笔 qpainter qpen qbrush

本文主要是介绍QPainter 画笔(QPen)和画刷(QBrush),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132813

相关文章

GUI编程08:画笔paint

本节内容视频链接:10、画笔paint_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p=10&vd_source=b5775c3a4ea16a5306db9c7c1c1486b5 package com.yundait.lesson03;import java.awt.*;import java.awt.event.Wind

Python画笔案例-035 绘制五彩连珠

1、绘制五彩连珠 通过 python 的turtle 库绘制五彩连珠图,如下图: 2、实现代码  绘制五彩连珠图,以下为实现代码: """五彩连珠.py"""import turtle# 定义颜色表叫cscs = ['red','orange','yellow','green','cyan']print(turtle.getscreen().getshapes())turtl

Python画笔案例-029 通过打点法画圆球

1、绘制蝌蚪 通过 python 的turtle 库通过打点法画圆球的图案,如下图: 2、实现代码  通过打点法画圆球,以下为实现代码: """打点法画圆球.py"""import turtleimport randomturtle.delay(0) # 设定绘画延时为0毫秒 turtle.speed(0) #

Python画笔案例-027 绘制蝌蚪

1、绘制蝌蚪 通过 python 的turtle 库绘制蝌蚪的图案,如下图: 2、实现代码  绘制一个蝌蚪的图案,以下为实现代码: """蝌蚪.py"""import turtleturtle.bgcolor('yellow') # 背景颜色turtle.pensize(2) # 画笔粗细turtle.penup(

Qt:玩转QPainter序列九(文本,文本框,填充)

前言 继续承接序列八 正文 1. drawImage系列函数 绘制图像 inline void drawImage(const QPoint &p, const QImage &image); 作用: 在指定的点 p 上绘制 QImage 图像。图像的左上角将对齐到 p 点。 inline void drawImage(int x, int y, const QImage &im

Qt中的QPainter问题

在Qt中出现如下问题A paint device can only be painted by one painter at a time.找来找去,结果应该是这句代码有问题QPainter painter = new QPainter(this); 这是因为这种赋值方式,右边的new新建了一个实例然后将这个实例拷贝给了painter所以导致有两个QPainter

Python画笔案例-025 绘制星光点点

1、绘制星光点点 通过 python 的turtle 库绘制星光点点的图案,如下图: 2、实现代码  绘制一个星光点点的图案,以下为实现代码: """星光点点.py"""import random # 随机模块import turtle # 海龟模块turtle.ht()

Python画笔案例-024 绘制八圆围正方

1、绘制八圆围正方 通过 python 的turtle 库绘制八圆围正方的图案,如下图: 2、实现代码  绘制一个八圆围正方,以下为实现代码: """八圆围正方.py"""from turtle import Turtle # 从海龟模块导入Turtle命令# 新建造型为Turtle的隐藏海龟tom = Turtle(shape='turtle',visible=False)

Qt:玩转QPainter后转之太极图

前言 简单了解了QPainter之后还是要做两个小例子练一练,不实际去做,只看看函数是没啥太大提升的,这里就简单画一个太极图。 正文 我们都知道太极分为阴阳鱼两部分,阴鱼(黑色)有个白色鱼眼,阳鱼(白色)有个黑色鱼眼;所以我们在画图的时候也可以分成阴阳两部分来画 单看阳鱼 不算鱼眼的话可以分成三部分,我们可以先画一个大半圆,用大半圆减去上面一个小半圆,再加上下面一个小半圆即可 阴鱼正好

Unity实战案例 2D小游戏HappyGlass(画笔摇晃效果)

本案例素材和教程都来自Siki学院,十分感谢教程中的老师 本文仅作学习笔记分享交流,不作任何商业用途 using System.Collections;using System.Collections.Generic;using UnityEngine;public class Pencil : MonoBehaviour{//摆动速度public float pencilSpeed