【Qt从入门到入土】7.绘画机制

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值