大家好,又见面了,我是你们的朋友全栈君。
简介:
The QMovie class is a convenience class for playing movies with QImageReader.
Header: |
#include <QMovie> |
qmake: |
QT += gui |
Inherits: |
QMovie类用来显示简单的并且没有声音的动画,比如GIF格式的图片等。
如果你想要显示视频或者多媒体,可以使用Qt Multimedia 多媒体框架。
显示一个简单的动画,常用的方式如下:
QLabel label; QMovie *movie = new QMovie("animations/fire.gif"); label.setMovie(movie); movie->start();
实例:
运行效果:
主要代码:
(基类为QWidget)
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();}
动态效果图:
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148407.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...