Qt QPainter - 画家类

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

根据下图选择自己喜欢的线条风格绘画:
在这里插入图片描述

ConstantValueDescription
Qt::NoPen0根本没有线。例如,QPainter::drawRect()填充但不画任何边界线。
Qt::SolidLine1一个普通的线。
Qt::DashLine2用几个像素分隔的破折号。
Qt::DotLine3由几个像素分隔的点。
Qt::DashDotLine4错开点和破折号。
Qt::DashDotDotLine5一划,两个点,一划,两个点。
Qt::CustomDashLine6使用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)));	// 填充背景颜色

在这里插入图片描述

ConstantValueDescription
Qt::NoBrush0没有刷模式
Qt::SolidPattern1统一的颜色
Qt::Dense1Pattern2极密的刷花纹
Qt::Dense2Pattern3非常密集的笔刷图案
Qt::Dense3Pattern4有些密集的笔刷图案
Qt::Dense4Pattern5半密刷图案
Qt::Dense5Pattern6有些稀疏的刷纹
Qt::Dense6Pattern7非常稀疏的刷子图案
Qt::Dense7Pattern8极疏刷图案
Qt::HorPattern9水平线;横线
Qt::VerPattern10垂直线
Qt::CrossPattern11横线和垂线交叉
Qt::BDiagPattern12落后的对角线
Qt::FDiagPattern13对角线
Qt::DiagCrossPattern14穿越对角线
Qt::LinearGradientPattern15线性梯度(使用专用的QBrush构造函数设置)
Qt::ConicalGradientPattern17锥形梯度(使用专用的QBrush构造函数设置)
Qt::RadialGradientPattern16径向梯度(使用专用的QBrush构造函数设置)
Qt::TexturePattern24自定义模式(参见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,操作更方便哦


总结:
画家类是一个很好玩的东西,但是本人仅学习到了一点皮毛。使用它可以画出各种各样的效果,也可以使用它来开发一些简单的小游戏。

在Linux Qt中,使用QPainter绘制点的方法是使用drawPoint函数。drawPoint函数接受一个QPoint参数,表示要绘制的点的坐标。以下是一个示例代码: void Widget::paintEvent(QPaintEvent *ev) { // 构造画家对象 QPainter painter(this); // 保存当前画家状态 painter.save(); // 设置画笔颜色 painter.setPen(QPen(QColor(Qt::green))); // 设置抗锯齿 painter.setRenderHint(QPainter::Antialiasing, true); // 绘制点 painter.drawPoint(QPoint(50, 50)); // 恢复上面保存的状态 painter.restore(); } 在上述代码中,我们在paintEvent函数中创建了一个QPainter对象,并设置了画笔颜色和抗锯齿属性。然后使用drawPoint函数绘制了一个坐标为(50, 50)的点。最后,我们恢复了之前保存的画家状态。 #### 引用[.reference_title] - *1* *3* [QtQPainter的使用](https://blog.csdn.net/qq_41317716/article/details/129786785)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [QT_QPainter,qt坐标系统,viewport](https://blog.csdn.net/weixin_42712593/article/details/115548019)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值