Qt 显示gif

开发环境 Qt5.5.1、Qt Creator 3.5.1 

Qt 与 Android 一样,如果把gif当做普通图片加载的话有且仅会显示图片的第一帧。

因此我实现了一个自定义控件,既可以加载动态的gif,也可以加载普通的图片

(1)mygifwidget.h

#ifndef MYGIFWIDGET_H
#define MYGIFWIDGET_H
 
#include <QLabel>
#include <QMovie>
#include <QPalette>
#include <QBrush>
#include <QResizeEvent>
#include <QPaintEvent>
#include <QPainter>
 
class MyGifWidget : public QLabel
{
    Q_OBJECT
public:
    explicit MyGifWidget(QWidget *parent = 0);
    ~MyGifWidget();
    void resizeEvent(QResizeEvent* e);
    void paintEvent(QPaintEvent* e);
    bool setPath(QString path);
    bool setGif(QString path);
    bool setImage(QString path);
    void stop();
private:
    QMovie* movie;
    QPixmap* pixmap;
    bool setImage(QPixmap* pixmap);
};
 
#endif // MYGIFWIDGET_H

(2)mygifwidget.cpp

#include "mygifwidget.h"
 
MyGifWidget::MyGifWidget(QWidget *parent) : QLabel(parent) {
    this->setAutoFillBackground(true);
    movie = NULL;
    pixmap = NULL;
}
 
MyGifWidget::~MyGifWidget() {
    if(movie != NULL) delete movie;
    if(pixmap != NULL) delete pixmap;
}
 
void MyGifWidget::resizeEvent(QResizeEvent *e) {
    if(isHidden()) {
        return;
    }
    if(movie != NULL && movie->isValid()) {
        movie->setScaledSize(e->size());
    } else if(pixmap != NULL && !pixmap->isNull()) {
        pixmap->scaled(e->size());
    }
}
 
void MyGifWidget::paintEvent(QPaintEvent *e) {
    if(!isVisible()) {
        return;
    }
    if(pixmap != NULL && !pixmap->isNull()) {
        QPainter* painter = new QPainter(this);
        painter->drawPixmap(e->rect(), *pixmap);
        delete painter;
    } else {
        QLabel::paintEvent(e);
    }
}
 
bool MyGifWidget::setPath(QString path) {
    if(path.isEmpty()) {
        return false;
    }
    if(path.toLower().endsWith(".gif")) {
        return setGif(path);
    } else {
        return setImage(path);
    }
}
 
bool MyGifWidget::setGif(QString path) {
    stop();
    movie = new QMovie(path);
    bool result = movie->isValid();
    if(result) {
        movie->setScaledSize(this->size());
        this->setMovie(movie);
        movie->start();
    }
    return result;
}
 
bool MyGifWidget::setImage(QString path) {
    stop();
    pixmap = new QPixmap(path);
    return setImage(pixmap);
}
 
bool MyGifWidget::setImage(QPixmap* pixmap) {
    if(!pixmap->isNull()) {
        QPalette* palette = new QPalette();
        pixmap->scaled(this->size());
        palette->setBrush(QPalette::Window, QBrush(*pixmap));
        setPalette(*palette);
        delete palette;
        return true;
    }
    return false;
}
 
void MyGifWidget::stop() {
    if(movie != NULL) {
        movie->stop();
        delete movie;
        movie = NULL;
    }
    if(pixmap != NULL){
        delete pixmap;
        pixmap = NULL;
    }
}
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值