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

相关推荐

发表回复

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

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