从零开始学Qt(58):一文读懂QBrush

从零开始学Qt(58):一文读懂QBrushQBrush定义了 QPainter绘图时的填充特性,包括填充颜色、填充样式、材质填充时的材质图片等,其主要函数如下 (省略了函数参数中的con

大家好,欢迎来到IT知识分享网。

QBrush定义了 QPainter绘图时的填充特性,包括填充颜色、填充样式、材质填充时的材质图片等,其主要函数如下 (省略了函数参数中的const关键字)。

  • void setColor(QColor &color):设置画刷颜色,实体填充时即为填充颜色
  • void setStyle(Qt::BrushStyle style):设置圆刷样式,参数为Qt::BrushStyle枚举类型
  • void setTexture(QPixmap &pixmap):设置一个QPixmap类型的图片作为画刷的图片,画刷样式自动设置为Qt: :TexturePattem
  • void setTextureImage(QImage &image):设置一个QImage类型的图片作为画刷的图片,画刷样式自动设置为Qt: :TexturePattem

填充样式

setStyle(Qt::BrushStyle style)函数设置画刷的样式,参数是Qt::BrushStyle style枚举类型,该枚举类型的取值如下。

  • Qt::NoBrush 不填充
  • Qt::SolidPattern 单一颜色填充
  • Qt::Dense1Pattern:极其密集图案填充
  • Qt::Dense2Pattern:非常密集图案填充
  • Qt::Dense3Pattern:略微密集图案填充
  • Qt::Dense4Pattern:一半密集图案填充
  • Qt::Dense5Pattern:略微稀疏图案填充
  • Qt::Dense6Pattern:非常稀疏图案填充
  • Qt::Dense7Pattern:极其稀疏图案填充
  • Qt::HorPattern 水平线填充
  • Qt::VerPattern 垂直线填充
  • Qt::CrossPattern:交叉水平垂直线
  • Qt::BDiagPattern:向后对角线填充
  • Qt::FDiagPattern:向前对角线填充
  • Qt::DiagCrossPattern:交叉对角线填充
  • Qt::LinearGradientPattern 线性渐变,需要使用QLinearGradient类对象作为Brush
  • Qt::RadialGradientPattern 辐射渐变,需要使用QRadialGradient类对象作为Brush
  • Qt::ConicalGradientPattern 圆锥型渐变,需要使用QConicalGradient类对象作为Brush
  • Qt::TexturePattern 材质填充,需要指定texture或texturelmage图片
从零开始学Qt(58):一文读懂QBrush

简单样式示意图

渐变填充需要使用专门的类作为Brush赋值给QPainter。其他各种线型填充只需设置类型参数即可,使用材质需要设置材质图片。

材质填充示例

下面是使用资源文件里的一个图片进行材质填充的示例程序,用材质图片填充一个矩形,程 序运行结果如图所示。

void Widget::paintEvent(QPaintEvent *event) { QPainter painter(this); int W=this->width(); //绘图区宽度 int H=this->height(); //绘图区高度 QRect rect(W/4,H/4,W/2,H/2); //中间区域矩形框 //设置画笔 QPen pen; pen.setWidth(3); //线宽 pen.setColor(Qt::red); //划线颜色 pen.setStyle(Qt::SolidLine);//线的类型,实线、虚线等 painter.setPen(pen); //S置画刷 QPixmap texturePixmap("texture.jpg"); QBrush brush; brush.setStyle(Qt::TexturePattern); //填充样式 brush.setTexture(texturePixmap); //设置材质图片 painter.setBrush(brush); //绘图 painter.drawRect(rect); }
从零开始学Qt(58):一文读懂QBrush

材质填充示意图

渐变填充类型

使用渐变填充需要用渐变类的对象作为Painter的brush,有3个实现渐变填充的类。

  • QLinearGradient:线性渐变。指定一个起点及其颜色,终点及其颜色,还可以指定中间的某个点的颜色,起点至终点之间的颜色会线性插值计算,得到线性渐变的填充颜色。
  • QRadialGradient:有简单辐射渐变和扩展辐射渐变两种方式。简单辐射渐变是在一个圆内 的一个焦点和一个端点之间生成渐变颜色,扩展辐射渐变是在一个焦点圆和一个中心圆之 间生成渐变色。
  • QConicalGradient:圆锥形渐变,围绕一个中心点逆时针生成渐变颜色。

这3种渐变的示例效果如图所示。

从零开始学Qt(58):一文读懂QBrush

3种渐变填充的效果

这3个渐变类都继承自QGradient类,除了生成渐变颜色的方式不同之外,在设定的渐变颜 色坐标范围之外,还需要用QGradient类的setSpread(QGradient::Spread method)函数设置延展方式。枚举类型QGradient::Spread有3种取值,分别表示3种延展效果:

  • PadSpread模式是用结束点的颜色填充外部区域,这是缺省的方式。
  • RepeatSpread模式是重复使用渐变方式填充外部区域。
  • ReflectSpread是反射式重复使用渐变方式填充外部区域。

下图是使用辐射渐变时3种延展方式的效果。setSpread()对圆锥形渐变不起作用。

从零开始学Qt(58):一文读懂QBrush

延展方式的效果

辐射渐变示例

下面的代码演示使用渐变效果绘图,程序中使用了辐射渐变。

void Widget::paintEvent(QPaintEvent *event) { QPainter painter(this); int W=this->width(); int H=this->height(); //径向渐变 QRadialGradient radialGrad(W/2,H/2,qMax(W/8,H/8),W/2,H/2); radialGrad.setColorAt(0,Qt::green); radialGrad.setColorAt(1,Qt::blue); radialGrad.setSpread(QGradient::ReflectSpread); painter.setBrush(radialGrad); //绘图 painter.drawRect(this->rect()); //填充更大区域,会有延展效果 }

上面的代码中定义QRadialGradient对象时使用的构造函数原型是:

QRadialGradient(qreal cx, qreal cy, qreal radius, qreal fx, qreal fy)

其中,(cx,cy)是辐射填充的中心点,程序中设置为(W/2, H/2),也就是Widget窗口的中心;radius是辐射填充区的半径,程序中设置为qMax(W/8, H/8); (fx,fy)是焦点坐标,程序中设置为(W/2, H/2),与中心点相同。

设置辐射渐变的起点颜色和终点颜色的语句是:

radialGrad.setColorAt(0,Qt::green); radialGrad.setColorAt(1,Qt::blue);

这里的“点”使用了逻辑坐标,0表示起点,即辐射中心点;1表示终点,即填充区圆的圆周。再用 setSpread()函数设置延展方式为 QGradient::ReflectSpread。

最后的绘图语句是:

painter.drawRect(this->rect());

这里绘制一个矩形,但是使用的矩形是this->rect(),即Widget窗口的整个矩形区域,它大于定义的辐射填充区域,所以会有延展效果。程序运行效果如下图所示。

从零开始学Qt(58):一文读懂QBrush

辐射渐变示例

线型渐变示例

若使用线性渐变填充,示例代码如下。定义QLinearGradient对象时指定了线性渐变的起点和终点,设置颜色时可以在起点和终点之间设置多个点的颜色值。

void Widget::paintEvent(QPaintEvent *event) { QPainter painter(this); QLinearGradient linearGrad(rect().left(), rect().top(), rect().right(), rect().top());// 从左到右 linearGrad.setColorAt(0, Qt::blue);//起点颜色 linearGrad.setColorAt(0.5, Qt::green);//中间点颜色 linearGrad.setColorAt(1, Qt::red);//终点颜色 linearGrad.setSpread(QGradient::ReflectSpread); //展布模式 painter.setBrush(linearGrad); painter.drawRect(this->rect()); }

创建QLinearGradient对象时传递了两个坐标点,分别表示填充区的起点和终点,起点和终点的定义方式不同,可以实现水平渐变、垂直渐变、或对角渐变等不同效果。

从零开始学Qt(58):一文读懂QBrush

线型渐变示例

圆锥形渐变示例

使用圆锥形渐变的示例代码如下。创建QConicalGradient对象时指定了中心点坐标和起始角度,然后设置多个点的颜色。但是注意,圆锥形填充没有延展效果。

void Widget::paintEvent(QPaintEvent *event) { QPainter painter(this); int W=this->width(); int H=this->height(); QConicalGradient coniGrad(W/2,H/2,45); coniGrad.setColorAt(0,Qt::yellow); coniGrad.setColorAt(0.5,Qt::blue); coniGrad.setColorAt(1,Qt::green); painter.setBrush(coniGrad); painter.drawRect(this->rect()); }
从零开始学Qt(58):一文读懂QBrush

圆锥形渐变

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/69399.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信