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

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

首页休闲益智画线奇兵更新时间:2024-04-25

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

填充样式

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

简单样式示意图

渐变填充需要使用专门的类作为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); }

材质填充示意图

渐变填充类型

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

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

3种渐变填充的效果

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

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

延展方式的效果

辐射渐变示例

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

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窗口的整个矩形区域,它大于定义的辐射填充区域,所以会有延展效果。程序运行效果如下图所示。

辐射渐变示例

线型渐变示例

若使用线性渐变填充,示例代码如下。定义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对象时传递了两个坐标点,分别表示填充区的起点和终点,起点和终点的定义方式不同,可以实现水平渐变、垂直渐变、或对角渐变等不同效果。

线型渐变示例

圆锥形渐变示例

使用圆锥形渐变的示例代码如下。创建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()); }

圆锥形渐变

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved