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类)

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 集合类型python_python需要学哪些

    集合类型python_python需要学哪些集合集合的特点:是一种可迭代的、无序的、不能包含重复元素的数据结构去重b=[10,5,6,1,9,1]c=set(b)print(c)>>>{1,5

  • 【Java-Set转List】

    【Java-Set转List】这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Mar

    2022年10月18日
  • Java多态性:Java什么是多态?

    Java多态性:Java什么是多态?多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通…

  • ul li设置横排,并除去li前的圆点建议收藏

    效果预览:http://hovertree.com/texiao/css/如何用CSS制作横向菜单让ulli横向排列及圆点处理我们先建立一个无序列表,来建立菜单的结构。代码是:首页网站地图Hove

    2021年12月21日
  • 关于变量在for内部new还是先在循环外定义的一些思考「建议收藏」

    关于变量在for内部new还是先在循环外定义的一些思考「建议收藏」关于变量在for内部new还是先在循环外定义的一些思考

  • Sublime的中文GBK显示乱码的解决方法「建议收藏」

    Sublime的中文GBK显示乱码的解决方法

发表回复

您的电子邮箱地址不会被公开。

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