使用QPainter和QPixmap裁切圆形头像

裁切图片可以用来设置指定裁切的区域形状,然后在把图片绘制到裁切的pix上,这样目标pix就会只显示裁切出来的区域的内容。
裁切的过程也是一个重新绘制的过程,步骤如下:

  1. 使用QPixmap加载源图片的信息src;
  2. 根据获取源图片的信息src之后,创建目标pix,用于裁切形状和后续绘制内容,并设置pix.fill(Qt::transparent)背景透明(不设置透明的话,裁切区域的其他部分会显示为黑色背景);
  3. 在目标pix上,使用QPainterPath 绘制裁切的区域,可以添加形状如矩形,圆形椭圆等,裁切同时指定裁切区域的原点,半径,宽高等;
  4. 在目标pix上,使用QPainter:: setClipPath把QPainterPath绘制的裁切区域设置到目标pix上;
  5. 在目标pix上,绘制内容,内容为源图片数据;
  6. 在目标label上,通过label->setPixmap(pix);把绘制的目标pix添加到label上显示;
  7. 如果需要最终设定label的大小缩放,再lebel->resize即可

Qt代码例子如下:

    QPixmap src(":/icons/panda2.jpeg");  //加载源图片
    QPixmap pix(src.width(), src.height());  //创建一个新的pixmap作为painter的绘图设备
    qDebug()<<src.width()<<src.height();
    pix.fill(Qt::transparent);  //设置图片透明

    QPainter painter(&pix);  //在创建的新的pix上进行绘制
    painter.setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform); //抗锯齿效果

    //设置裁切区域
    QPainterPath path;
    //设置圆形半径,取源图片宽度和高度中,较大者的一半作为裁切半径
    int radius = src.height()<src.width() ? src.height()/2:src.width()/2;
    path.addEllipse(src.rect().center(), radius,radius);  //绘制裁切区域的大小
    painter.setClipPath(path);  //设置裁切区域,设置后,图片只显示设定的裁切区域内容
    
    //把源图片的内容绘制到创建的pix上,非裁切区域的内容将不显示
    painter.drawPixmap(pix.rect(), src);
    //按照指定的大小缩放图片
    ui->labelAvatar->setFixedSize(100,100);
    ui->labelAvatar->setScaledContents(true);

	ui->labelAvatar->setPixmap(pix);

效果如下:
在这里插入图片描述
这是制作的一个模仿QQ登录界面的主窗口,效果如下:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值