QPainter是Qt的画家类,可以使用他进行画画,即画图案。
需要添加头文件:#include <QPainter>
然后重写该函数:
protected:
void paintEvent(QPaintEvent *event) override;
实现该方法,在其方法体内进行绘画即可。
无需调用,系统会自动调用。当有新的绘画时,需要调用update();
函数进行更新。
注意:必须在重写的函数体内就进行绘画才会有效果。
当然也有例外,也可以在其他函数进行绘画,然后在paintEvent函数中进行调用。
如下例子:
#include "TextQPainter.h"
#include <QPainter>
TextQPainter::TextQPainter(QWidget *parent) : QWidget(parent) {
ui.setupUi(this);
update();
}
TextQPainter::~TextQPainter() {
}
void TextQPainter::paintEvent(QPaintEvent *event) {
test();
}
void TextQPainter::test() {
QPainter painter(this);
// 设置线宽
painter.setPen(QPen(QBrush(Qt::SolidPattern), 10));
// 设置画笔颜色
painter.setPen(QColor(100, 200, 100));
// 画直线
painter.drawLine(5, 5, 300, 300);
// 画矩形
painter.drawRect(30, 30, 300, 200);
// 画圆
painter.drawEllipse(30, 30, 100, 100);
// 画文本
painter.drawText(50, 50, tr("画文本"));
}
画直线
painter.drawLine(5, 5, 300, 300);
设置线宽
painter.setPen(QPen(QBrush(Qt::SolidPattern), 10));
画矩形
painter.drawRect(30, 30, 300, 200);
画圆
painter.drawEllipse(30, 30, 100, 100);
设置画笔颜色
painter.setPen(QColor(100, 200, 100));
画文本
painter.drawText(50, 50, tr("画文本"));
设置字体
painter.setFont(QFont("Agency FB", 15)); // 设置字体
画图片
painter.drawPixmap(50, 100, QPixmap("p.jpg"));
如下图:
当然,还可以画其他特殊的图案:(根据下图可以画自己喜爱的模型)
注意:用QPainter画弧度所使用的角度值,是以1/16°为单位的,在画弧度的时候1°用16表示。
另QPainter::drawPixmap()可直接将图片画到部件上。
设置画笔风格
画笔风格 Qt::PenStyle
painter.setPen(Qt::DashLine);
根据下图选择自己喜欢的线条风格绘画:
Constant | Value | Description |
---|---|---|
Qt::NoPen | 0 | 根本没有线。例如,QPainter::drawRect()填充但不画任何边界线。 |
Qt::SolidLine | 1 | 一个普通的线。 |
Qt::DashLine | 2 | 用几个像素分隔的破折号。 |
Qt::DotLine | 3 | 由几个像素分隔的点。 |
Qt::DashDotLine | 4 | 错开点和破折号。 |
Qt::DashDotDotLine | 5 | 一划,两个点,一划,两个点。 |
Qt::CustomDashLine | 6 | 使用QPainterPathStroker::setDashPattern()定义的自定义模式。 |
设置笔帽
笔帽风格 Qt::PenCapStyle
painter.setPen(Qt::RoundCap);
Qt::SquareCap 方形线端,不覆盖线的端点
Qt::FlatCap 方形线端,覆盖线的端点,并以线框一半向外延伸
Qt::RoundCap 圆线端
设置连接点
连接点 Qt::PenJoinStyle
painter.setPen(Qt::BevelJoin);
Qt::BevelJoin 两条线相汇形成方形连接
Qt::MiterJoin 两条线相汇形成尖角连接
Qt::RoundJoin两条线相汇形成圆角连接
设置画刷
画刷风格 Qt::BrushStyle
painter.setBrush(Qt::Dense4Pattern); // 设置画刷风格
设置画刷颜色
可用于填充形状的背景颜色
painter.setBrush(QBrush(QColor(20, 50, 100))); // 填充背景颜色
Constant | Value | Description |
---|---|---|
Qt::NoBrush | 0 | 没有刷模式 |
Qt::SolidPattern | 1 | 统一的颜色 |
Qt::Dense1Pattern | 2 | 极密的刷花纹 |
Qt::Dense2Pattern | 3 | 非常密集的笔刷图案 |
Qt::Dense3Pattern | 4 | 有些密集的笔刷图案 |
Qt::Dense4Pattern | 5 | 半密刷图案 |
Qt::Dense5Pattern | 6 | 有些稀疏的刷纹 |
Qt::Dense6Pattern | 7 | 非常稀疏的刷子图案 |
Qt::Dense7Pattern | 8 | 极疏刷图案 |
Qt::HorPattern | 9 | 水平线;横线 |
Qt::VerPattern | 10 | 垂直线 |
Qt::CrossPattern | 11 | 横线和垂线交叉 |
Qt::BDiagPattern | 12 | 落后的对角线 |
Qt::FDiagPattern | 13 | 对角线 |
Qt::DiagCrossPattern | 14 | 穿越对角线 |
Qt::LinearGradientPattern | 15 | 线性梯度(使用专用的QBrush构造函数设置) |
Qt::ConicalGradientPattern | 17 | 锥形梯度(使用专用的QBrush构造函数设置) |
Qt::RadialGradientPattern | 16 | 径向梯度(使用专用的QBrush构造函数设置) |
Qt::TexturePattern | 24 | 自定义模式(参见QBrush::setTexture()) |
铺展效果
铺展效果 QGradient::Type
painter.setBrush(QBrush(QColor(10, 20, 30), QGradient::PadSpread));
QGradient::PadSpread :默认风格
QGradient::RepeatSpread:线性渐变
QGradient::ReflectSpread:圆形渐变
填充模式
填充模式 Qt::FillRule
painter.setBrush(Qt::OddEvenFill);
Qt::OddEvenFill填充规则:从图形中某一点画一条水平线到图形外,若这条线与图形边线的交点为奇数则说明此点位于图形的内部;若交点为偶数,则此点在图形的外部。
Qt::WindingFill填充规则:从图形总某一点画一条水平线到图形外,每个交点外边线方向可能向上、向下、方向相反的相互抵消,若结果不为0表此点在图形内,若为0则在图形外。其中边线的方向是由QPainterPath创建时根据描述的顺序决定的,如果采用addRect()或addPolygon()等函数加入的图形默认为顺时针方向。
兼容模式
兼容模式 QPainter::CompositionMode
Qt帮助文档解释:
定义数字图像合成所支持的模式。合成模式用于指定一个图像(源)中的像素如何与另一个图像(目标)中的像素合并。
请注意,用RasterOp前缀表示的逐位光栅操作模式,仅在X11和光栅绘图引擎中本机支持。这意味着在Mac上使用这些模式的唯一方法是通过QImage。对于带有alpha组件的笔和笔刷,不支持所指示的混合模式。同时,打开QPainter::Antialiasing渲染提示将有效地禁用RasterOp模式。
最常见的类型是SourceOver(通常被称为alpha混合),其中源像素在目标像素上混合,以这样的方式,源的alpha组件定义像素的透明度。
一些合成模式需要在源或目标图像中有一个alpha通道来产生效果。为了获得最佳性能,首选的图像格式是format_argb32_premultiplying。
当一个合成模式被设置,它适用于所有的绘画操作,钢笔,笔刷,梯度和像素图/图像绘制。
例子(方形头像转圆头像):
// 头像转圆头像
// 参数一:图片 参数二:空的圆图片 参数三:需要设置原图片的大小
QPixmap BasicWindow::getRoundImage(const QPixmap &src, QPixmap &mask, QSize maskSize) {
if (maskSize == QSize(0, 0)) {
maskSize = mask.size();
} else {
mask = mask.scaled(maskSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
}
// 保存转换后的图像
QImage resultImage(maskSize, QImage::Format_ARGB32_Premultiplied);
QPainter painter(&resultImage);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(resultImage.rect(), Qt::transparent);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawPixmap(0, 0, mask);
painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
painter.drawPixmap(0, 0, src.scaled(maskSize, Qt::KeepAspectRatio, Qt::SmoothTransformation));
painter.end();
return QPixmap::fromImage(resultImage);
}
另外,本人使用画家类写了一个小例子,附上下载链接有兴趣的可以下载回去玩玩。Qt5.9.6 + vs2017 IDE .
链接:https://pan.baidu.com/s/1HCFcaJ40q46f4bVUw9xEew
提取码:sou9
复制这段内容后打开百度网盘手机App,操作更方便哦
总结:
画家类是一个很好玩的东西,但是本人仅学习到了一点皮毛。使用它可以画出各种各样的效果,也可以使用它来开发一些简单的小游戏。