Qt中QLabel显示动态图的平滑缩放
解决Qt中QLabel显示动态图的平滑缩放Qt中显示动态图常用QLabel,创建QMovie对象,并通过QLabel::setMovie显示。需要将动态图根据容器缩放时,设置QLabel::setScaledContents。这样做会导致图片细节生硬,不够平滑。解决办法是,重写QLabel::paintEvent方法,读取QLabel::movie,将QMovie::currentPi
·
解决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);
}
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)