QT列表代理中绘制圆形图片(头像)

这篇博客探讨了如何在Qt环境下正确地绘制圆形头像图片,避免因图片大小不一导致的平铺问题。通过使用QPainter和QPixmap的结合,实现了保持比例缩放并绘制圆角矩形来适应不同尺寸的头像图片,同时解决方形图片四角可能被遮挡的问题。代码示例中展示了如何利用QPainterPath设置裁剪区域,确保头像在圆形区域内正确显示。
摘要由CSDN通过智能技术生成

网上给出的方法会导致图片平铺,如果图片小则会绘制很多。不知道是不是在QWidget下绘制是否正常。


		QPixmap head;
		head.load(data.Url, 0, Qt::AvoidDither | Qt::ThresholdAlphaDither | Qt::ThresholdDither);
		if (!head.isNull())
		{
			head = head.scaled(mHeadSize, mHeadSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);

			painter->save();
			painter->setRenderHints(QPainter::HighQualityAntialiasing | QPainter::SmoothPixmapTransform);//设置画笔为无锯齿
			painter->setBrush(QBrush(head));
			painter->setPen(QPen(Qt::lightGray, 2, Qt::SolidLine));
			painter->drawRoundRect(bgRect.x() + (bgRect.width() - mHeadSize) / 2, bgRect.y(), mHeadSize, mHeadSize, mHeadSize, mHeadSize);
			painter->restore();
		}

不知道为什么平铺这么奇怪

绘制圆形头像图片,有一点瑕疵形状是方形的图片四角可能会被遮挡部分。不过对于我来说已经满足要求了。


		QPixmap head;
		head.load(data.Url, 0, Qt::AvoidDither | Qt::ThresholdAlphaDither | Qt::ThresholdDither);
		if (!head.isNull())
		{
			head = head.scaled(mHeadSize, mHeadSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
			painter->restore();

			painter->save();
			painter->setRenderHints(QPainter::HighQualityAntialiasing | QPainter::SmoothPixmapTransform);//设置画笔为无锯齿
			painter->setPen(QPen(Qt::lightGray, 2, Qt::SolidLine));
			painter->drawRoundRect(bgRect.x() + (bgRect.width() - mHeadSize) / 2, bgRect.y(), mHeadSize, mHeadSize, mHeadSize, mHeadSize);//绘制圆形圈圈
			QPainterPath path;//加入一个圆形   绘图是从左上角的(56,20)坐标开始绘制的  ,120,120是绘图的宽高
			path.addEllipse(bgRect.x() + (bgRect.width() - mHeadSize) / 2, bgRect.y(), mHeadSize, mHeadSize);
			painter->setClipPath(path);
			painter->drawPixmap(bgRect.x() + (bgRect.width() - mHeadSize) / 2, bgRect.y(), head);
			painter->restore();

			painter->save();
		}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值