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())
        {
            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);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/eiilpux17/article/details/78568213
今日推荐