summaryrefslogtreecommitdiffstats
path: root/examples/multimedia/videowidget/videoplayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/multimedia/videowidget/videoplayer.cpp')
-rw-r--r--examples/multimedia/videowidget/videoplayer.cpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/examples/multimedia/videowidget/videoplayer.cpp b/examples/multimedia/videowidget/videoplayer.cpp
new file mode 100644
index 000000000..1a778d2fb
--- /dev/null
+++ b/examples/multimedia/videowidget/videoplayer.cpp
@@ -0,0 +1,137 @@
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "videoplayer.h"
+
+#include <QBoxLayout>
+#include <QFileDialog>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QMediaPlayer>
+#include <QPushButton>
+#include <QSizePolicy>
+#include <QSlider>
+#include <QStandardPaths>
+#include <QString>
+#include <QStyle>
+#include <QVideoWidget>
+
+VideoPlayer::VideoPlayer(QWidget *parent) : QWidget(parent)
+{
+ m_mediaPlayer = new QMediaPlayer(this);
+ QVideoWidget *videoWidget = new QVideoWidget;
+
+ QAbstractButton *openButton = new QPushButton(tr("Open..."));
+ connect(openButton, &QAbstractButton::clicked, this, &VideoPlayer::openFile);
+
+ m_playButton = new QPushButton;
+ m_playButton->setEnabled(false);
+ m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
+
+ connect(m_playButton, &QAbstractButton::clicked, this, &VideoPlayer::play);
+
+ m_positionSlider = new QSlider(Qt::Horizontal);
+ m_positionSlider->setRange(0, 0);
+
+ connect(m_positionSlider, &QAbstractSlider::sliderMoved, this, &VideoPlayer::setPosition);
+
+ m_errorLabel = new QLabel;
+ m_errorLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
+
+ QBoxLayout *controlLayout = new QHBoxLayout;
+ controlLayout->setContentsMargins(0, 0, 0, 0);
+ controlLayout->addWidget(openButton);
+ controlLayout->addWidget(m_playButton);
+ controlLayout->addWidget(m_positionSlider);
+
+ QBoxLayout *layout = new QVBoxLayout;
+ layout->addWidget(videoWidget);
+ layout->addLayout(controlLayout);
+ layout->addWidget(m_errorLabel);
+
+ setLayout(layout);
+
+ m_mediaPlayer->setVideoOutput(videoWidget);
+ connect(m_mediaPlayer, &QMediaPlayer::playbackStateChanged, this,
+ &VideoPlayer::mediaStateChanged);
+ connect(m_mediaPlayer, &QMediaPlayer::positionChanged, this, &VideoPlayer::positionChanged);
+ connect(m_mediaPlayer, &QMediaPlayer::durationChanged, this, &VideoPlayer::durationChanged);
+ connect(m_mediaPlayer, &QMediaPlayer::errorChanged, this, &VideoPlayer::handleError);
+}
+
+VideoPlayer::~VideoPlayer() { }
+
+void VideoPlayer::openFile()
+{
+ QFileDialog fileDialog(this);
+ fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
+ fileDialog.setWindowTitle(tr("Open Movie"));
+ fileDialog.setDirectory(QStandardPaths::standardLocations(QStandardPaths::MoviesLocation)
+ .value(0, QDir::homePath()));
+ if (fileDialog.exec() == QDialog::Accepted)
+ setUrl(fileDialog.selectedUrls().constFirst());
+}
+
+void VideoPlayer::setUrl(const QUrl &url)
+{
+ m_errorLabel->setText(QString());
+ setWindowFilePath(url.isLocalFile() ? url.toLocalFile() : QString());
+ m_mediaPlayer->setSource(url);
+ m_playButton->setEnabled(true);
+}
+
+void VideoPlayer::play()
+{
+ switch (m_mediaPlayer->playbackState()) {
+ case QMediaPlayer::PlayingState:
+ m_mediaPlayer->pause();
+ break;
+ default:
+ m_mediaPlayer->play();
+ break;
+ }
+}
+
+void VideoPlayer::mediaStateChanged(QMediaPlayer::PlaybackState state)
+{
+ switch (state) {
+ case QMediaPlayer::PlayingState:
+ m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
+ break;
+ default:
+ m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
+ break;
+ }
+}
+
+void VideoPlayer::positionChanged(qint64 position)
+{
+ m_positionSlider->setValue(position);
+}
+
+void VideoPlayer::durationChanged(qint64 duration)
+{
+ m_positionSlider->setRange(0, duration);
+}
+
+void VideoPlayer::setPosition(int position)
+{
+ m_mediaPlayer->setPosition(position);
+}
+
+void VideoPlayer::handleError()
+{
+ if (m_mediaPlayer->error() == QMediaPlayer::NoError)
+ return;
+
+ m_playButton->setEnabled(false);
+ const QString errorString = m_mediaPlayer->errorString();
+ QString message = "Error: ";
+ if (errorString.isEmpty())
+ message += " #" + QString::number(int(m_mediaPlayer->error()));
+ else
+ message += errorString;
+ m_errorLabel->setText(message);
+}
+
+#include "moc_videoplayer.cpp"