diff options
Diffstat (limited to 'examples/multimedia/videographicsitem')
-rw-r--r-- | examples/multimedia/videographicsitem/CMakeLists.txt | 39 | ||||
-rw-r--r-- | examples/multimedia/videographicsitem/doc/images/video-videographicsitem.png | bin | 0 -> 54436 bytes | |||
-rw-r--r-- | examples/multimedia/videographicsitem/doc/src/videographicsitem.qdoc | 19 | ||||
-rw-r--r-- | examples/multimedia/videographicsitem/main.cpp | 39 | ||||
-rw-r--r-- | examples/multimedia/videographicsitem/videographicsitem.pro | 14 | ||||
-rw-r--r-- | examples/multimedia/videographicsitem/videoplayer.cpp | 139 | ||||
-rw-r--r-- | examples/multimedia/videographicsitem/videoplayer.h | 48 |
7 files changed, 298 insertions, 0 deletions
diff --git a/examples/multimedia/videographicsitem/CMakeLists.txt b/examples/multimedia/videographicsitem/CMakeLists.txt new file mode 100644 index 000000000..653627c25 --- /dev/null +++ b/examples/multimedia/videographicsitem/CMakeLists.txt @@ -0,0 +1,39 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) +project(videographicsitem LANGUAGES CXX) + +set(CMAKE_AUTOMOC ON) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/multimedia/videographicsitem") + +find_package(Qt6 REQUIRED COMPONENTS Core Gui Multimedia MultimediaWidgets Widgets) + +qt_add_executable(videographicsitem + main.cpp + videoplayer.cpp videoplayer.h +) + +set_target_properties(videographicsitem PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) + +target_link_libraries(videographicsitem PUBLIC + Qt::Core + Qt::Gui + Qt::Multimedia + Qt::MultimediaWidgets + Qt::Widgets +) + +install(TARGETS videographicsitem + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff --git a/examples/multimedia/videographicsitem/doc/images/video-videographicsitem.png b/examples/multimedia/videographicsitem/doc/images/video-videographicsitem.png Binary files differnew file mode 100644 index 000000000..e333c54a2 --- /dev/null +++ b/examples/multimedia/videographicsitem/doc/images/video-videographicsitem.png diff --git a/examples/multimedia/videographicsitem/doc/src/videographicsitem.qdoc b/examples/multimedia/videographicsitem/doc/src/videographicsitem.qdoc new file mode 100644 index 000000000..5dcb7143e --- /dev/null +++ b/examples/multimedia/videographicsitem/doc/src/videographicsitem.qdoc @@ -0,0 +1,19 @@ +// Copyright (C) 2015 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \example videographicsitem + \title Video Graphics Item Example + \ingroup multimedia_examples + \brief Streaming video on a graphics scene. + \meta {tag} {widgets} + + \e{Video Graphics Item} demonstrates how to implement a QGraphicsItem that + displays video on a graphics scene using QVideoSink. + + \image video-videographicsitem.png + + \sa {Video Widget Example} + + \include examples-run.qdocinc +*/ diff --git a/examples/multimedia/videographicsitem/main.cpp b/examples/multimedia/videographicsitem/main.cpp new file mode 100644 index 000000000..85d1ec92b --- /dev/null +++ b/examples/multimedia/videographicsitem/main.cpp @@ -0,0 +1,39 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "videoplayer.h" + +#include <QApplication> +#include <QCommandLineParser> +#include <QCommandLineOption> +#include <QDir> +#include <QUrl> + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + + QCoreApplication::setApplicationName("Player Example"); + QCoreApplication::setOrganizationName("QtProject"); + QCoreApplication::setApplicationVersion(QT_VERSION_STR); + QCommandLineParser parser; + parser.setApplicationDescription("Qt MultiMedia Player QGraphicsView Example"); + parser.addHelpOption(); + parser.addVersionOption(); + parser.addPositionalArgument("url", "The URL to open."); + parser.process(app); + + VideoPlayer player; + + if (!parser.positionalArguments().isEmpty() && player.isPlayerAvailable()) { + const QUrl url = + QUrl::fromUserInput(parser.positionalArguments().constFirst(), + QDir::currentPath(), QUrl::AssumeLocalFile); + player.load(url); + } + + player.show(); + + return app.exec(); +} + diff --git a/examples/multimedia/videographicsitem/videographicsitem.pro b/examples/multimedia/videographicsitem/videographicsitem.pro new file mode 100644 index 000000000..3415ef64c --- /dev/null +++ b/examples/multimedia/videographicsitem/videographicsitem.pro @@ -0,0 +1,14 @@ +TEMPLATE = app +TARGET = videographicsitem + +QT += multimedia multimediawidgets + +HEADERS += videoplayer.h + +SOURCES += main.cpp \ + videoplayer.cpp + +target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/videographicsitem +INSTALLS += target + +QT+=widgets diff --git a/examples/multimedia/videographicsitem/videoplayer.cpp b/examples/multimedia/videographicsitem/videoplayer.cpp new file mode 100644 index 000000000..096fabd77 --- /dev/null +++ b/examples/multimedia/videographicsitem/videoplayer.cpp @@ -0,0 +1,139 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "videoplayer.h" + +#include <QtWidgets> +#include <QGraphicsVideoItem> + +VideoPlayer::VideoPlayer(QWidget *parent) + : QWidget(parent) +{ + m_mediaPlayer = new QMediaPlayer(this); + const QSize screenGeometry = screen()->availableSize(); + m_videoItem = new QGraphicsVideoItem; + m_videoItem->setSize(QSizeF(screenGeometry.width() / 3, screenGeometry.height() / 2)); + + QGraphicsScene *scene = new QGraphicsScene(this); + QGraphicsView *graphicsView = new QGraphicsView(scene); + + scene->addItem(m_videoItem); + + QSlider *rotateSlider = new QSlider(Qt::Horizontal); + rotateSlider->setToolTip(tr("Rotate Video")); + rotateSlider->setRange(-180, 180); + rotateSlider->setValue(0); + + connect(rotateSlider, &QAbstractSlider::valueChanged, + this, &VideoPlayer::rotateVideo); + + 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); + + 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(this); + layout->addWidget(graphicsView); + layout->addWidget(rotateSlider); + layout->addLayout(controlLayout); + + m_mediaPlayer->setVideoOutput(m_videoItem); + connect(m_mediaPlayer, &QMediaPlayer::playbackStateChanged, + this, &VideoPlayer::mediaStateChanged); + connect(m_mediaPlayer, &QMediaPlayer::positionChanged, this, &VideoPlayer::positionChanged); + connect(m_mediaPlayer, &QMediaPlayer::durationChanged, this, &VideoPlayer::durationChanged); +} + +VideoPlayer::~VideoPlayer() +{ +} + +QSize VideoPlayer::sizeHint() const +{ + return (m_videoItem->size() * qreal(3) / qreal(2)).toSize(); +} + +bool VideoPlayer::isPlayerAvailable() const +{ + return m_mediaPlayer->isAvailable(); +} + +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) + load(fileDialog.selectedUrls().constFirst()); +} + +void VideoPlayer::load(const QUrl &url) +{ + 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::rotateVideo(int angle) +{ + //rotate around the center of video element + qreal x = m_videoItem->boundingRect().width() / 2.0; + qreal y = m_videoItem->boundingRect().height() / 2.0; + m_videoItem->setTransform(QTransform().translate(x, y).rotate(angle).translate(-x, -y)); +} diff --git a/examples/multimedia/videographicsitem/videoplayer.h b/examples/multimedia/videographicsitem/videoplayer.h new file mode 100644 index 000000000..a5be31efc --- /dev/null +++ b/examples/multimedia/videographicsitem/videoplayer.h @@ -0,0 +1,48 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef VIDEOPLAYER_H +#define VIDEOPLAYER_H + +#include <QMediaPlayer> +#include <QWidget> + +QT_BEGIN_NAMESPACE +class QAbstractButton; +class QSlider; +class QGraphicsVideoItem; +QT_END_NAMESPACE + +class VideoPlayer : public QWidget +{ + Q_OBJECT + +public: + VideoPlayer(QWidget *parent = nullptr); + ~VideoPlayer(); + + void load(const QUrl &url); + bool isPlayerAvailable() const; + + QSize sizeHint() const override; + +public slots: + void openFile(); + void play(); + +private slots: + void mediaStateChanged(QMediaPlayer::PlaybackState state); + void positionChanged(qint64 position); + void durationChanged(qint64 duration); + void setPosition(int position); + void rotateVideo(int angle); + +private: + QMediaPlayer *m_mediaPlayer = nullptr; + QGraphicsVideoItem *m_videoItem = nullptr; + QAbstractButton *m_playButton = nullptr; + QSlider *m_positionSlider = nullptr; +}; + +#endif + |