• 这3个工具都是用来辅助QPainter绘图的

一、QPen

  • 功能:​用于绘图时对线条进行设置,主要包括线宽、颜色、线型等


常用函数

  • 通常一个设置函数都有一个对应的读取函数,例如setColor()用于设置画笔颜色,对应的读取画笔颜色的函数为color()。下面仅列出了设置函数

Qt:46---QPainter绘图之QPen、QBrush、QFont工具_枚举类型



线条样式

  • setStyle(Qt::PenStyle style)函数:​用于设置线条样式,参数是一个Qt::PenStyle枚举类型(Qt::NoPen表示不绘制线条)
  • setDashOffset()、setDashPattern()函数:​用于设置自定义的线条样式

Qt:46---QPainter绘图之QPen、QBrush、QFont工具_填充区_02

端点样式

  • setCapStyle(Qt::PenCapStyle style)函数:​用于设置线条端点样式,参数是一个Qt::PenCapStyle枚举类型

Qt:46---QPainter绘图之QPen、QBrush、QFont工具_填充区_03

连接样式

  • setJoinStyle(Qt::PenJoinStyle style)函数:用于设置线条连接样式,参数是一个Qt::PenJoinStyle枚举类型

Qt:46---QPainter绘图之QPen、QBrush、QFont工具_构造函数_04


二、QBrush

  • 功能:​定义了QPainter绘图时的填充特性,包括填充颜色、填充样式、材质填充时的材质图片等


基本函数

  • 与QPen类似,对应的setXXX函数都用对应的XXX函数

Qt:46---QPainter绘图之QPen、QBrush、QFont工具_填充区_05



setStyle()函数

  • 该函数用于设置画刷的样式,参数是Qt::BrushStyle枚举类型,常见的有下面几种
  • 渐变填充需要使用专门的类作为Brush赋值给QPainter,后面介绍

Qt:46---QPainter绘图之QPen、QBrush、QFont工具_枚举类型_06Qt:46---QPainter绘图之QPen、QBrush、QFont工具_枚举类型_07



渐变填充

有3个实现渐变填充的类:

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

Qt:46---QPainter绘图之QPen、QBrush、QFont工具_枚举类型_08

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

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

Qt:46---QPainter绘图之QPen、QBrush、QFont工具_构造函数_09



演示案例

  • 重写paintEvent函数

Qt:46---QPainter绘图之QPen、QBrush、QFont工具_构造函数_10

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);
//设置图片
QPixmap texturePixmap(":/pic/1.jpg");
//设置画刷
QBrush brush;
brush.setStyle(Qt::TexturePattern);
brush.setTexture(texturePixmap);

//添加画刷
painter.setBrush(brush);
//开始绘图
painter.drawRect(rect);
}



QRadialGradient类​“辐射渐变”填充案例

Qt:46---QPainter绘图之QPen、QBrush、QFont工具_构造函数_11

  • 构造函数参数:(cs,cy):辐射填充的中心点。radius:辐射填充区的半径。(fx,fy):焦点坐标
  • setColorAt()函数:设置辐射渐变的起点颜色和终点颜色
  • setSpread()函数:设置图形延展方式

Qt:46---QPainter绘图之QPen、QBrush、QFont工具_枚举类型_12

void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
int W=this->width(); //绘图区的宽
int H=this->height(); //绘图区的高

//辐射填充的中心点:W/2,H/2 ;辐射填充区的半径:qMax(W/8,H/8) ;焦点坐标(设置为与中心点相同):W/2,H/2
QRadialGradient radialGrad(W/2,H/2,qMax(W/8,H/8),W/2,H/2);
radialGrad.setColorAt(0,Qt::green); //0表示起点,即辐射中心点
radialGrad.setColorAt(1,Qt::blue); //1表示终点,即填充区圆的圆周
radialGrad.setSpread(QGradient::ReflectSpread); //设置延展方式

painter.setBrush(radialGrad);

painter.drawRect(this->rect());//绘图
}



QLinearCradient类“线型​渐变​​填充案例

  • QLinearCradient类构造函数参数:​参数1和2表示填充区的起点坐标,参数3和4表示终点坐标。根据定义不同可以实现水平渐变、垂直渐变或对角渐变等不同效果

Qt:46---QPainter绘图之QPen、QBrush、QFont工具_枚举类型_13Qt:46---QPainter绘图之QPen、QBrush、QFont工具_填充区_14

void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
int W=this->width(); //绘图区的宽
int H=this->height(); //绘图区的高

//QLinearGradient linearGrad(rect().left(),rect().top(),rect().right(),rect().bottom()); //对角线形式
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());
}



QConicalGradient类​“圆锥形渐变”填充案例

  • QConicalGradient类构造函数参数:​指定了中心点坐标和起始角度,然后设置多个点的颜色
  • QConicalGradient圆锥形填充没有延展效果

Qt:46---QPainter绘图之QPen、QBrush、QFont工具_填充区_15

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());
}


三、QFont

  • 设置字体,QFont不仅可以用于QPainter,还可以用于其他地方,例如设置控件的文本字体等


相关函数

  • 用QFontDialog::getFont对话框获取字体,见文章:​​

//设置字体大小
void QFont::setPointSize(int pointSize)

//设置字体是否粗体
void QFont::setBold(bool enable)