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

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

你可能感兴趣的:(Qt常见问题,Qt技术总结,Qt,qt,动态图,平滑,缩放)