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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java swing开发窗体程序开发(一)GUI编程[通俗易懂]

    java swing开发窗体程序开发(一)GUI编程[通俗易懂]JavaSWing就是java提供的一个类库专门用于开发窗体程序的,相对于C#的winform,javaswing的开发要比C#更加麻烦,他不像C#拥有可视化的界面编辑工具而是需要像QT一样纯代码式GUI编程。java的好处就是通用性强,跨平台,这个java窗体程序做好之后,哪都可以用。然而C#的winform只能运行在有.net框架上的平台,然而.net支持最好的,也就只有windows…

    2022年8月23日
    3
  • vue 集成高德地图进行批量标注和信息窗体展示

    vue 集成高德地图进行批量标注和信息窗体展示                                   vue集成高德地图进行批量标注和信息窗体展示         高德地图进行地理位置的标注和信息窗体展示是我们很常用的一个功能,其实高德api里面已经清楚的说明怎么用了,但是自己总结一下记录在自己的笔记里,也是有些许好处的。高德api样列展示地址是:https://lbs.amap.com/api/javascript…

    2022年5月21日
    66
  • phpmyadmin安装教程及配置设置

    phpmyadmin安装教程及配置设置.一般网上下载到的phpmyadmin是一个压缩包,我们将其释放到htdocs目录中,例如htdocs\phpmyadmin。  2.打开phpmyadmin目录,在此目录下是否有config.sample.inc.php文件,如果存在,那么将其改名为config.inc.php。(根据版本不同,有可能直接就有config.inc.php文件,那就无需改名,也有可能根本就没有config.

    2022年6月1日
    26
  • react根据json配置创建表单_关于web页的叙述不正确

    react根据json配置创建表单_关于web页的叙述不正确我是一个新手,MVC3和剃刀和我需要结合/加载的WebGrid一旦数据从AJAX后返回的帮助。任何帮助将真正理解(项目截止日期即将到来之际);)我的情况是这样的:我有两个级联的下拉列表。第一个列表包含从数据库中的区域。一旦一个区域中,选择它填充第二个下拉用的设备的清单。一旦设备被选中,我需要填充的WebGrid有建筑物清单。我有级联下拉菜单正常工作Index.cshtml:@u…

    2022年10月5日
    0
  • vuejs 和 element 搭建的一个后台管理界面

    vuejs 和 element 搭建的一个后台管理界面

    2021年10月11日
    44
  • oracle多字段去重查询_根据某一字段去重

    oracle多字段去重查询_根据某一字段去重oracle怎么去重查询oracle去重查询的方法是:oracle数据库多字段去重方法介绍:distinct关键字、groupby、row_number()over(partitionby列orderby列desc)我的需求是:根据某几列去重查询出去重后的全部信息。最后我选择的是第三种方法。我的想法:我想找出一种更简单的方法去实现去重查询。越直接越好。表结构&&…

    2022年10月23日
    0

发表回复

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

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