1.如何添加
需要添加头文件:#include <QPainter>
然后重写该函数:
protected:
void paintEvent(QPaintEvent *event) override;
注意:所有的绘画必须在paintEvent里才有效。
2.API
//画直线
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表示。
调用界面刷新的时候可以使用update,update会调起绘画事件(等待下一个事件循环,非立即),repaint可以直接调起绘画事件,想要绘制效果保留,必须使用save()和restore()(必须成对出现),而且机制Qt绘画默认双缓冲机制!!!
兼容模式
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);
}