bmstu-mt-mla/mainwindow.cpp

308 lines
11 KiB
C++
Raw Permalink Normal View History

2022-12-05 23:53:37 +03:00
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QMenuBar *menuBar = new QMenuBar();
m_menuFile = menuBar->addMenu("&File");
m_openAction = new QAction("&Open");
m_openAction->setStatusTip(tr("Open a document"));
m_menuFile->addAction(m_openAction);
m_menuFile->addSeparator();
m_quitAction = new QAction("&Quit");
m_quitAction->setShortcut(tr("CTRL+Q"));
m_quitAction->setStatusTip(tr("Quit application"));
m_menuFile->addAction(m_quitAction);
connect(this->m_openAction, &QAction::triggered, this, &MainWindow::slotOpenAction);
connect(this->m_quitAction, &QAction::triggered, qApp, &QApplication::quit);
this->setMenuBar(menuBar);
2022-12-07 16:55:19 +03:00
this->resize(800, 600);
2022-12-05 23:53:37 +03:00
show();
}
MainWindow::~MainWindow()
{
delete ui;
}
2022-12-07 16:55:19 +03:00
void MainWindow::delay(int delay) {
QTime dieTime= QTime::currentTime().addSecs(delay);
while (QTime::currentTime() < dieTime)
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
2022-12-05 23:53:37 +03:00
void MainWindow::slotOpenAction() {
m_filename = QFileDialog::getOpenFileName(
2022-12-07 16:55:19 +03:00
this, tr("Выберите файл"), "../", tr("MPEG (*.mpeg) ;; PDF (*.pdf) ;; DOCX (*.docx) ;; XLSX (*.xlsx) ;; PPTX (*.pptx)"));
2022-12-05 23:53:37 +03:00
if (m_filename != "") {
2022-12-07 16:55:19 +03:00
if (axObj) {
qDebug() << "Close file!\n";
closeFile();
}
if (m_videoWidget) {
qDebug() << "Close MPEG!\n";
closeMPEG();
}
2022-12-05 23:53:37 +03:00
if (m_filename.endsWith(".pdf")) {
openPDF(m_filename);
} else if (m_filename.endsWith(".pptx")) {
openPPTX(m_filename);
} else if (m_filename.endsWith(".docx")) {
openDOCX(m_filename);
} else if (m_filename.endsWith(".xlsx")) {
openXLSX(m_filename);
2022-12-07 16:55:19 +03:00
} else if (m_filename.endsWith(".mpeg")) {
openMPEG(m_filename);
2022-12-05 23:53:37 +03:00
}
}
}
void MainWindow::closeFile() {
if (axObj != nullptr) {
QProcess process;
QString strCmd;
strCmd = "taskkill /im winword.exe /f";
process.execute(strCmd);
strCmd = "taskkill /im EXCEL.exe /f";
process.execute(strCmd);
strCmd = "taskkill /im POWERPNT.exe /f";
process.execute(strCmd);
strCmd = "taskkill /im AcroRd32.exe /f";
process.execute(strCmd);
process.close();
axObj->close();
axObj->clear();
delete axObj;
axObj = nullptr;
2022-12-07 16:55:19 +03:00
qDebug() << "file closed!";
2022-12-05 23:53:37 +03:00
}
}
void MainWindow::openPDF(QString &filename) {
axObj = new QAxWidget(this);
setCentralWidget(axObj);
if(!axObj->setControl("Adobe PDF Reader"))
QMessageBox::critical(this, "Error", "Make sure you have Adobe Reader (and its ActiveX) installed!");
axObj->dynamicCall("LoadFile(QString)", filename);
}
2022-12-07 16:55:19 +03:00
/* run slideshow */
void MainWindow::playPPTX() {
// Open parameter
QList<QVariant> 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()");
}
2022-12-05 23:53:37 +03:00
void MainWindow::openPPTX(QString &filename) {
2022-12-07 16:55:19 +03:00
/* инициализация окна виджетом */
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) {
2022-12-05 23:53:37 +03:00
return;
}
2022-12-07 16:55:19 +03:00
if (!axObj->setControl(filename)) {
2022-12-05 23:53:37 +03:00
return;
}
axObj->dynamicCall("LoadFile(const QString&)", filename);
2022-12-07 16:55:19 +03:00
axObj->dynamicCall("SetVisible (bool Visible)", "false");
2022-12-05 23:53:37 +03:00
axObj->setProperty("DisplayAlerts", false);
axObj->setProperty("DisplayScrollBars", true);
2022-12-07 16:55:19 +03:00
delay(1);
2022-12-05 23:53:37 +03:00
2022-12-07 16:55:19 +03:00
axObj->show();
axObj->raise();
qDebug() << "3";
connect(this->m_btnPlay, &QPushButton::clicked, this, &MainWindow::playPPTX);
2022-12-05 23:53:37 +03:00
}
void MainWindow::openXLSX(QString &filename) {
axObj = new QAxWidget("Excel.Application", this);
setCentralWidget(axObj);
2022-12-07 16:55:19 +03:00
if (axObj == nullptr) {
2022-12-05 23:53:37 +03:00
return;
}
axObj->dynamicCall("SetVisible (bool Visible)", "false");
axObj->setProperty("DisplayAlerts", false);
axObj->setProperty("DisplayScrollBars", true); // Show scroll bar
axObj->setGeometry(this->geometry());
axObj->setControl(filename);
axObj->show();
}
void MainWindow::openDOCX(QString &filename) {
axObj = new QAxWidget("Word.Application", this);
setCentralWidget(axObj);
2022-12-07 16:55:19 +03:00
if (axObj == nullptr) {
2022-12-05 23:53:37 +03:00
return;
}
axObj->dynamicCall("SetVisible (bool Visible)", "false");
axObj->setFocusPolicy(Qt::StrongFocus);
axObj->setProperty("DisplayAlerts", false);
axObj->setProperty("DisplayHorizontalScrollBar", true); // Show scroll bar
axObj->setGeometry(this->geometry());
axObj->setControl(filename);
axObj->show();
}
2022-12-07 16:55:19 +03:00
/* продолжить проигрывать видео */
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;
}