Qt: GIF图片播放器(QMovie类)

Qt: GIF图片播放器(QMovie类)QMovie类用来显示简单的并且没有声音的动画,比如GIF格式的图片等。如果你想要显示视频或者多媒体,可以使用QtMultimedia多媒体框架。

大家好,又见面了,我是你们的朋友全栈君。

简介:

QMovie Class

The QMovie class is a convenience class for playing movies with QImageReader. 

Header:

#include <QMovie>

qmake:

QT += gui

Inherits:

QObject


QMovie类用来显示简单的并且没有声音的动画,比如GIF格式的图片等。

如果你想要显示视频或者多媒体,可以使用Qt Multimedia 多媒体框架。


显示一个简单的动画,常用的方式如下:

 QLabel label; QMovie *movie = new QMovie("animations/fire.gif"); label.setMovie(movie); movie->start();

实例:

运行效果:

Qt: GIF图片播放器(QMovie类)

主要代码:

(基类为QWidget)

Qt: GIF图片播放器(QMovie类)


1. movieplayer.h

/*movieplayer.h*/#ifndef MOVIEPLAYER_H#define MOVIEPLAYER_H#include <QCheckBox>#include <QGridLayout>#include <QHBoxLayout>#include <QLabel>#include <QMovie>#include <QSlider>#include <QSpinBox>#include <QToolButton>#include <QVBoxLayout>#include <QWidget>class QCheckBox;class QGridLayout;class QHBoxLayout;class QLabel;class QMovie;class QSlider;class QSpinBox;class QToolButton;class QVBoxLayout;class MoviePlayer : public QWidget{    Q_OBJECTpublic:    MoviePlayer(QWidget *parent = 0);    void openFile(const QString &fileName);private slots:    void open();    void goToFrame(int frame);    void fitToWindow();    void updateButtons();    void updateFrameSlider();private:    void createControls();    void createButtons();    QString currentMovieDirectory;    QLabel *movieLabel;    QMovie *movie;    QToolButton *openButton;    QToolButton *playButton;    QToolButton *pauseButton;    QToolButton *stopButton;    QToolButton *quitButton;    QCheckBox *fitCheckBox;    QSlider *frameSlider;    QSpinBox *speedSpinBox;    QLabel *frameLabel;    QLabel *speedLabel;    QGridLayout *controlsLayout;    QHBoxLayout *buttonsLayout;    QVBoxLayout *mainLayout;};#endif

2. movieplayer.cpp

/*movieplayer.cpp*/#include <QtGui>#include <QString>#include <QStyle>#include <QFileDialog>#include "movieplayer.h"MoviePlayer::MoviePlayer(QWidget *parent)    : QWidget(parent){    movie = new QMovie(this);    movie->setCacheMode(QMovie::CacheAll);    movieLabel = new QLabel(tr("No movie loaded"));    movieLabel->setAlignment(Qt::AlignCenter);    movieLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);    movieLabel->setBackgroundRole(QPalette::Shadow);    movieLabel->setAutoFillBackground(true);    currentMovieDirectory = ".gif";    createControls();    createButtons();    connect(movie, SIGNAL(frameChanged(int)), this, SLOT(updateFrameSlider()));    connect(movie, SIGNAL(stateChanged(QMovie::MovieState)),            this, SLOT(updateButtons()));    connect(fitCheckBox, SIGNAL(clicked()), this, SLOT(fitToWindow()));    connect(frameSlider, SIGNAL(valueChanged(int)), this, SLOT(goToFrame(int)));    connect(speedSpinBox, SIGNAL(valueChanged(int)),            movie, SLOT(setSpeed(int)));    mainLayout = new QVBoxLayout;    mainLayout->addWidget(movieLabel);    mainLayout->addLayout(controlsLayout);    mainLayout->addLayout(buttonsLayout);    setLayout(mainLayout);    updateFrameSlider();    updateButtons();    setWindowTitle(tr("Movie Player"));    resize(400, 400);}void MoviePlayer::open(){    QString fileName = QFileDialog::getOpenFileName(this, tr("Open a Movie"),                                                    currentMovieDirectory);    if (!fileName.isEmpty())        openFile(fileName);}void MoviePlayer::openFile(const QString &fileName){    currentMovieDirectory = QFileInfo(fileName).path();    movie->stop();    movieLabel->setMovie(movie);    movie->setFileName(fileName);    movie->start();    updateFrameSlider();    updateButtons();}void MoviePlayer::goToFrame(int frame){    movie->jumpToFrame(frame);}void MoviePlayer::fitToWindow(){    movieLabel->setScaledContents(fitCheckBox->isChecked());}void MoviePlayer::updateFrameSlider(){    bool hasFrames = (movie->currentFrameNumber() >= 0);    if (hasFrames)    {        if (movie->frameCount() > 0)        {            frameSlider->setMaximum(movie->frameCount() - 1);        }        else        {            if (movie->currentFrameNumber() > frameSlider->maximum())                frameSlider->setMaximum(movie->currentFrameNumber());        }        frameSlider->setValue(movie->currentFrameNumber());    }    else    {        frameSlider->setMaximum(0);    }    frameLabel->setEnabled(hasFrames);    frameSlider->setEnabled(hasFrames);}void MoviePlayer::updateButtons(){    playButton->setEnabled(movie->isValid() && movie->frameCount() != 1            && movie->state() == QMovie::NotRunning);    pauseButton->setEnabled(movie->state() != QMovie::NotRunning);    pauseButton->setChecked(movie->state() == QMovie::Paused);    stopButton->setEnabled(movie->state() != QMovie::NotRunning);}void MoviePlayer::createControls(){    fitCheckBox = new QCheckBox(tr("Fit to Window"));    frameLabel = new QLabel(tr("Current frame:"));    frameSlider = new QSlider(Qt::Horizontal);    frameSlider->setTickPosition(QSlider::TicksBelow);    frameSlider->setTickInterval(10);    speedLabel = new QLabel(tr("Speed:"));    speedSpinBox = new QSpinBox;    speedSpinBox->setRange(1, 9999);    speedSpinBox->setValue(100);    speedSpinBox->setSuffix(tr("%"));    controlsLayout = new QGridLayout;   //格子布局    controlsLayout->addWidget(fitCheckBox, 0, 0, 1, 2);    controlsLayout->addWidget(frameLabel, 1, 0);    controlsLayout->addWidget(frameSlider, 1, 1, 1, 2);    controlsLayout->addWidget(speedLabel, 2, 0);    controlsLayout->addWidget(speedSpinBox, 2, 1);}void MoviePlayer::createButtons()   //按钮水平布局{    QSize iconSize(36, 36);    openButton = new QToolButton;    openButton->setIcon(style()->standardIcon(QStyle::SP_DialogOpenButton));    openButton->setIconSize(iconSize);    openButton->setToolTip(tr("Open File"));    connect(openButton, SIGNAL(clicked()), this, SLOT(open()));    playButton = new QToolButton;    playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));    playButton->setIconSize(iconSize);    playButton->setToolTip(tr("Play"));    connect(playButton, SIGNAL(clicked()), movie, SLOT(start()));    pauseButton = new QToolButton;    pauseButton->setCheckable(true);    pauseButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));    pauseButton->setIconSize(iconSize);    pauseButton->setToolTip(tr("Pause"));    connect(pauseButton, SIGNAL(clicked(bool)), movie, SLOT(setPaused(bool)));    stopButton = new QToolButton;    stopButton->setIcon(style()->standardIcon(QStyle::SP_MediaStop));    stopButton->setIconSize(iconSize);    stopButton->setToolTip(tr("Stop"));    connect(stopButton, SIGNAL(clicked()), movie, SLOT(stop()));    quitButton = new QToolButton;    quitButton->setIcon(style()->standardIcon(QStyle::SP_DialogCloseButton));    quitButton->setIconSize(iconSize);    quitButton->setToolTip(tr("Quit"));    connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));    buttonsLayout = new QHBoxLayout;    buttonsLayout->addStretch();    buttonsLayout->addWidget(openButton);    buttonsLayout->addWidget(playButton);    buttonsLayout->addWidget(pauseButton);    buttonsLayout->addWidget(stopButton);    buttonsLayout->addWidget(quitButton);    buttonsLayout->addStretch();}

3. main.cpp

/*main.cpp*/#include <QApplication>#include "movieplayer.h"int main(int argc, char *argv[]){    QApplication app(argc, argv);    MoviePlayer player;    player.show();    return app.exec();}


动态效果图:

Qt: GIF图片播放器(QMovie类)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148407.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Faster-RCNN算法精读[通俗易懂]

    Faster-RCNN算法精读[通俗易懂]读论文:《FasterR-CNN:TowardsReal-TimeObjectDetectionwithRegionProposalNetworks》摘要:算法主要解决两个问题:1、提出区域建议网络RPN,快速生成候选区域;2、通过交替训练,使RPN和Fast-RCNN网络共享参数。一、RPN网络结构RPN网络的作用是输入一张图像,输出一批矩形候选区域

    2022年10月4日
  • django捕获DoesNotExist

    django捕获DoesNotExistfromdjango.core.exceptionsimportObjectDoesNotExisttry:user=User.objects.get(id=12873)exceptObjectDoesNotExist:print”user”

    2022年10月22日
  • ContextLoaderListener类和contextConfigLocation参数[通俗易懂]

    ContextLoaderListener类和contextConfigLocation参数[通俗易懂]一、web.xml中经常有如下配置 &amp;lt;listener&amp;gt;&amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt; &amp;lt;/listener&amp;gt;&amp;lt;context-param

    2022年6月26日
  • pycharm的字体设置_香港3开头的固定号码是什么

    pycharm的字体设置_香港3开头的固定号码是什么具体设置路径:File->settings->Editor->FileandCodeTemplates->PythonScript

    2022年8月25日
  • PyTorch基础——使用pytorch加载cifar10数据集

    PyTorch基础——使用pytorch加载cifar10数据集使用torchvision.datasets模块可以加载cifar10数据集,涉及函数为torchvision.datasets.CIFAR10(root,train,download)root:cifar10数据集存放目录train:True,表示加载训练数据集,False,表示加载验证数据集download:True,表示cifar10数据集在root指定的文件夹不存在时,会自动下载,False,表示不管root指定文件夹是否存在cifar10数据集,都不会自动下载cifar10数据集

    2022年6月22日
  • 利用opacity属性写过渡效果

    利用opacity属性写过渡效果opacity的意思是不透明性,opacity取值范围为0-1;opacity:0;表示完全透明,opacity:1;表示完全不透明。opacity:0于overflow:hidden不同,overflow:hidden会完全消除空间,opacity:0只是视觉上看不到,但是实际上会占用空间,这点我们常用来于:hover一起使用。&lt;!DOCTYPEhtml&gt;&lt;htmll…

    2022年5月25日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号