From c16ecd44e689418814da74a625d1ab9e3d453fde Mon Sep 17 00:00:00 2001 From: "Ivan I. Ovchinnikov" Date: Wed, 7 Dec 2022 16:55:19 +0300 Subject: [PATCH] video player --- PDF_Reader.pro | 3 +- mainwindow.cpp | 225 ++++++++++++++++++++++++++++++++++++++++++------- mainwindow.h | 65 ++++++++++++-- 3 files changed, 252 insertions(+), 41 deletions(-) diff --git a/PDF_Reader.pro b/PDF_Reader.pro index 431d642..046fa5c 100644 --- a/PDF_Reader.pro +++ b/PDF_Reader.pro @@ -1,4 +1,5 @@ -QT += core gui axcontainer +QT += core gui axcontainer multimediawidgets +WEBENGINE_CONFIG += use_proprietary_codecs greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = PDF_Reader TEMPLATE = app diff --git a/mainwindow.cpp b/mainwindow.cpp index ffe4499..e54f21b 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -21,6 +21,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(this->m_quitAction, &QAction::triggered, qApp, &QApplication::quit); this->setMenuBar(menuBar); + this->resize(800, 600); show(); } @@ -30,12 +31,24 @@ MainWindow::~MainWindow() } +void MainWindow::delay(int delay) { + QTime dieTime= QTime::currentTime().addSecs(delay); + while (QTime::currentTime() < dieTime) + QCoreApplication::processEvents(QEventLoop::AllEvents, 100); +} + void MainWindow::slotOpenAction() { m_filename = QFileDialog::getOpenFileName( - this, tr("Выберите файл"), "../", tr("PDF (*.pdf) ;; DOCX (*.docx) ;; XLSX (*.xlsx) ;; PPTX (*.pptx)")); + this, tr("Выберите файл"), "../", tr("MPEG (*.mpeg) ;; PDF (*.pdf) ;; DOCX (*.docx) ;; XLSX (*.xlsx) ;; PPTX (*.pptx)")); if (m_filename != "") { - qDebug() << "Close file!\n"; - closeFile(); + if (axObj) { + qDebug() << "Close file!\n"; + closeFile(); + } + if (m_videoWidget) { + qDebug() << "Close MPEG!\n"; + closeMPEG(); + } if (m_filename.endsWith(".pdf")) { openPDF(m_filename); @@ -45,6 +58,8 @@ void MainWindow::slotOpenAction() { openDOCX(m_filename); } else if (m_filename.endsWith(".xlsx")) { openXLSX(m_filename); + } else if (m_filename.endsWith(".mpeg")) { + openMPEG(m_filename); } } } @@ -66,6 +81,7 @@ void MainWindow::closeFile() { axObj->clear(); delete axObj; axObj = nullptr; + qDebug() << "file closed!"; } } @@ -78,46 +94,62 @@ void MainWindow::openPDF(QString &filename) { axObj->dynamicCall("LoadFile(QString)", filename); } +/* run slideshow */ +void MainWindow::playPPTX() { + // Open parameter + QList param_list; + axObj->setControl("PowerPoint.Application"); + param_list.append(m_filename); + param_list.append(1); + param_list.append(1); + param_list.append(0); + // Open a template file + QAxObject *presentations = axObj->querySubObject("Presentations"); + QAxObject *presentation = presentations->querySubObject("Open(const QString&,int,int,int)", param_list); + // Start the slides + QAxObject *slideshow = presentation->querySubObject("SlideShowSettings"); + slideshow->setProperty("RangeType", "ppShowAll"); + slideshow->dynamicCall("run()"); + +} + void MainWindow::openPPTX(QString &filename) { - axObj = new QAxWidget("Powerpoint.Application", this); - setCentralWidget(axObj); - if (axObj == nullptr) - { + /* инициализация окна виджетом */ + m_wideWidget = new QWidget; + setCentralWidget(m_wideWidget); + qDebug() << "1"; + /* здесь будут элементы управления и окно проигрывателя (выравнивание по горизонтали) */ + m_qvBoxLayout = new QVBoxLayout(m_wideWidget); + + axObj = new QAxWidget("PowerPoint.Application", m_wideWidget); + m_btnPlay = new QPushButton("Начать презентацию"); + qDebug() << "2"; + m_qvBoxLayout->addWidget(axObj); + m_qvBoxLayout->addWidget(m_btnPlay); + + if (axObj == nullptr) { return; } - if (!axObj->setControl(filename)) - { + if (!axObj->setControl(filename)) { return; } axObj->dynamicCall("LoadFile(const QString&)", filename); - axObj->dynamicCall("SetVisible (bool Visible)", "true"); + axObj->dynamicCall("SetVisible (bool Visible)", "false"); axObj->setProperty("DisplayAlerts", false); axObj->setProperty("DisplayScrollBars", true); - axObj->setGeometry(this->geometry()); + + delay(1); + axObj->show(); - - /* run slideshow */ - // // Open parameter - // QList param_list; - // param_list.append(filename); - // param_list.append(1); - // param_list.append(1); - // param_list.append(0); - // // Open a template file - // QAxObject *presentations = axObj->querySubObject("Presentations"); - // QAxObject *presentation = presentations->querySubObject("Open(const QString&,int,int,int)", param_list); - // // Start the slides - // QAxObject *slideshow = presentation->querySubObject("SlideShowSettings"); - // slideshow->setProperty("RangeType", "ppShowAll"); - // slideshow->dynamicCall("run()"); - + axObj->raise(); + qDebug() << "3"; + connect(this->m_btnPlay, &QPushButton::clicked, this, &MainWindow::playPPTX); } void MainWindow::openXLSX(QString &filename) { axObj = new QAxWidget("Excel.Application", this); setCentralWidget(axObj); - if (axObj == nullptr) - { + if (axObj == nullptr) { return; } axObj->dynamicCall("SetVisible (bool Visible)", "false"); @@ -130,8 +162,7 @@ void MainWindow::openXLSX(QString &filename) { void MainWindow::openDOCX(QString &filename) { axObj = new QAxWidget("Word.Application", this); setCentralWidget(axObj); - if (axObj == nullptr) - { + if (axObj == nullptr) { return; } axObj->dynamicCall("SetVisible (bool Visible)", "false"); @@ -142,3 +173,135 @@ void MainWindow::openDOCX(QString &filename) { axObj->setControl(filename); axObj->show(); } + +/* продолжить проигрывать видео */ +void MainWindow::playVideo() { + m_player->setPosition(m_position); + m_player->play(); +} + +/* остановка видео */ +void MainWindow::stopVideo() { + m_player->stop(); +} + +/* пауза видео */ +void MainWindow::pauseVideo() { + m_player->pause(); +} + +/* событие при изменении состояния видеопроигрывателя */ +void MainWindow::updateState(int state) { + switch (state) { + case QMediaPlayer::PlayingState: + /* media is played */ + break; + + case QMediaPlayer::PausedState: + /* media paused */ + break; + + case QMediaPlayer::StoppedState: + /* media is stopped */ + break; + } +} + +/* принудительно изменить время проигрывания */ +void MainWindow::changePosition() { + m_position = m_sliderVideo->value(); + m_player->setPosition(m_position); +} + +/* принудительно изменить время проигрывания */ +void MainWindow::updatePosition(qint64 position) { + m_position = position; + m_sliderVideo->setValue(m_position); +} + +/* изменить величину звука */ +void MainWindow::changeVolume(int volume) { + m_player->setVolume(volume); +} + +/* слот для иницализации значением слайдера видео */ +void MainWindow::updateDuration(qint64 duration) { + m_sliderVideo->setRange(0, m_player->duration()); + m_sliderVideo->setEnabled(duration > 0); + m_sliderVideo->setPageStep(duration / 10); +} + +/* инициализация медиа файла */ +void MainWindow::openMPEG(QString &filename) { + /* инициализация окна виджетом */ + m_wideWidget = new QWidget; + setCentralWidget(m_wideWidget); + + /* здесь будут элементы управления и окно проигрывателя (выравнивание по горизонтали) */ + m_qvBoxLayout = new QVBoxLayout(m_wideWidget); + + /* область для отображения видео */ + m_videoWidget = new QVideoWidget; + m_player = new QMediaPlayer(m_videoWidget); + m_player->setVideoOutput(m_videoWidget); + m_player->setMedia(QUrl::fromLocalFile(filename)); + + /* область размещения кнопок управления видео */ + m_hBtnsLayout = new QHBoxLayout; + m_play = new QPushButton("Play"); + m_stop = new QPushButton("Stop"); + m_pause = new QPushButton("Pause"); + m_sliderVolume = new QSlider(Qt::Horizontal); + m_sliderVolume->setRange(0, 100); // диапазон значений громкости + m_sliderVolume->setValue(50); // текущая громкость 50% + m_sliderVideo = new QSlider(Qt::Horizontal); + m_hBtnsLayout->addWidget(m_play, 1); + m_hBtnsLayout->addWidget(m_stop, 1); + m_hBtnsLayout->addWidget(m_pause, 1); + m_hBtnsLayout->addWidget(&m_labelVolume); + m_hBtnsLayout->addWidget(m_sliderVolume, 1); + m_hBtnsLayout->addWidget(&m_labelScroll); + m_hBtnsLayout->addWidget(m_sliderVideo, 5); + + /* поместить настроенные объекты в центральный виджет */ + m_qvBoxLayout->addWidget(m_videoWidget); + m_qvBoxLayout->addLayout(m_hBtnsLayout); + + /* связать слоты */ + connect(this->m_play, &QPushButton::clicked, this, &MainWindow::playVideo); + connect(this->m_stop, &QPushButton::clicked, this, &MainWindow::stopVideo); + connect(this->m_pause, &QPushButton::clicked, this, &MainWindow::pauseVideo); + connect(this->m_sliderVolume, &QSlider::sliderMoved, this, &MainWindow::changeVolume); + connect(this->m_sliderVideo, &QSlider::sliderMoved, this, &MainWindow::changePosition); + connect(this->m_sliderVideo, &QSlider::valueChanged, this, &MainWindow::changePosition); + connect(this->m_player, &QMediaPlayer::durationChanged, this, &MainWindow::updateDuration); + connect(this->m_player, &QMediaPlayer::positionChanged, this, &MainWindow::updatePosition); + connect(this->m_player, &QMediaPlayer::stateChanged, this, &MainWindow::updateState); + + /* начать проигрывать видео */ + playVideo(); +} + +void MainWindow::closeMPEG() { + /* отключение всех слотов */ + disconnect(this->m_play, &QPushButton::clicked, this, &MainWindow::playVideo); + disconnect(this->m_stop, &QPushButton::clicked, this, &MainWindow::stopVideo); + disconnect(this->m_pause, &QPushButton::clicked, this, &MainWindow::pauseVideo); + disconnect(this->m_sliderVolume, &QSlider::sliderMoved, this, &MainWindow::changeVolume); + disconnect(this->m_sliderVideo, &QSlider::sliderMoved, this, &MainWindow::changePosition); + disconnect(this->m_sliderVideo, &QSlider::sliderPressed, this, &MainWindow::changePosition); + disconnect(this->m_player, &QMediaPlayer::durationChanged, this, &MainWindow::updateDuration); + disconnect(this->m_player, &QMediaPlayer::positionChanged, this, &MainWindow::updatePosition); + disconnect(this->m_player, &QMediaPlayer::stateChanged, this, &MainWindow::updateState); + + /* удаление динамических объектов */ + delete m_sliderVideo; + delete m_sliderVolume; + delete m_play; + delete m_stop; + delete m_pause; + delete m_hBtnsLayout; + delete m_player; + delete m_videoWidget; + delete m_qvBoxLayout; +} diff --git a/mainwindow.h b/mainwindow.h index 82eda96..c58f417 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -5,6 +5,13 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include namespace Ui { class MainWindow; @@ -19,19 +26,59 @@ public: ~MainWindow(); private: - Ui::MainWindow *ui; - - QAxWidget *axObj{nullptr}; - QString m_filename; - void openPDF(QString&); - void openPPTX(QString&); - void openXLSX(QString&); - void openDOCX(QString&); - void closeFile(); +/* begin common objects */ + Ui::MainWindow *ui{nullptr}; + QWidget *m_wideWidget{nullptr}; + QVBoxLayout *m_qvBoxLayout{nullptr}; QMenuBar *mb{nullptr}; QMenu *m_menuFile{nullptr}; QAction *m_openAction{nullptr}; QAction *m_quitAction{nullptr}; + QString m_filename; + void delay(int); +/* end common objects */ + +/* begin DOCX, XLSX, PPTX objects */ + QAxWidget *axObj{nullptr}; + void openPDF(QString&); + void openXLSX(QString&); + void openDOCX(QString&); + void openPPTX(QString&); + void closeFile(); + QPushButton *m_btnPlay; +private slots: + void playPPTX(); +/* end DOCX, XLSX, PPTX objects */ + +/* begin MPEG objects */ +private: + void openMPEG(QString&); + void closeMPEG(); + + QVideoWidget *m_videoWidget{nullptr}; + QMediaPlayer *m_player{nullptr}; + QHBoxLayout *m_hBtnsLayout{nullptr}; + QPushButton *m_play{nullptr}; + QPushButton *m_stop{nullptr}; + QPushButton *m_pause{nullptr}; + QSlider *m_sliderVolume{nullptr}; + QSlider *m_sliderVideo{nullptr}; + QLabel m_labelVolume{"Volume:"}; + QLabel m_labelScroll{"Scroll:"}; + qint64 m_position{0}; + int m_volume; +private slots: + void playVideo(); + void stopVideo(); + void pauseVideo(); + void changeVolume(int); + void changePosition(); + void updatePosition(qint64); + void updateDuration(qint64); + void updateState(int); +/* end MPEG objects */ + + private slots: void slotOpenAction();