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