Qt中QLabel显示动态图的平滑缩放

19 篇文章 2 订阅
18 篇文章 3 订阅

解决Qt中QLabel显示动态图的平滑缩放

Qt中显示动态图常用QLabel,创建QMovie对象,并通过QLabel::setMovie显示。

需要将动态图根据容器缩放时,设置QLabel::setScaledContents。这样做会导致图片细节生硬,不够平滑。

解决办法是,重写QLabel::paintEvent方法,读取QLabel::movie,将QMovie::currentPixmap手动缩放并绘制。QPixmap::scaled第三个参数Qt::TransformationMode可以设置快速缩放或平滑缩放。

void AntialiasingMovieLabel::paintEvent(QPaintEvent *)
{
	if (this->movie() && this->movie()->isValid())
	{
		QPainter painter(this);
		painter.setRenderHint(QPainter::HighQualityAntialiasing, true);
		// 下面这行不需要设置混合模式,测试代码时估计忘了删
		// painter.setCompositionMode(QPainter::CompositionMode_Source);
		QPixmap curr_pix = this->movie()->currentPixmap();
		if (this->hasScaledContents())
		{
			// 如果是要考虑高分屏,缩放size需要乘以this.devicePixelRatio
			// 并对pix设置同样的devicePixelRatio
			QPixmap pix = curr_pix.scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
			painter.drawPixmap(QPoint(0, 0), pix);
		}
		else
		{
			painter.drawPixmap(QPoint(0, 0), curr_pix);
		}
	}
}
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值