fix mmt labs
This commit is contained in:
parent
df40d6c91c
commit
14040c5cbb
|
@ -11,7 +11,7 @@
|
||||||
\thispagestyle{empty}
|
\thispagestyle{empty}
|
||||||
\makeBMSTUHeader
|
\makeBMSTUHeader
|
||||||
|
|
||||||
\makeReportTitle{лабораторной}{3}{Разработка мультимедийного приложения}{Мультимедиа технологии}{}{Д.А. Видьманов}
|
\makeReportTitle{лабораторной}{2}{Мультимедийная веб-презентация}{Мультимедиа технологии}{}{Д.А. Видьманов}
|
||||||
\newpage
|
\newpage
|
||||||
\thispagestyle{empty}
|
\thispagestyle{empty}
|
||||||
\tableofcontents
|
\tableofcontents
|
||||||
|
@ -19,365 +19,277 @@
|
||||||
\pagestyle{fancy}
|
\pagestyle{fancy}
|
||||||
\sloppy
|
\sloppy
|
||||||
\section{Цель}
|
\section{Цель}
|
||||||
Целью работы является приобретение навыков создания мультимедийных приложений. Создать мультимедийное приложение.
|
Целью работы является приобретение навыков создания мультимедийной веб-презентации, ознакомление с основными правилами и требованиями к созданию веб-презентаций. Создать мультимедийную веб-презентацию в соответствии с изученными требованиями по заданной теме.
|
||||||
|
|
||||||
\section{Задачи}
|
\section{Задачи}
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Установить среду разработки;
|
\item Установить \code{node.js};
|
||||||
\item Описать критерии создания приложения;
|
\item Создать мультимедиа веб-презентацию, используя инструкции и рекомендации методического указания;
|
||||||
\item Написать код и отладить работу приложения.
|
\item Проверить ещё раз все требовании к презентации и создать отчет.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
|
|
||||||
|
\section{Методика и порядок выполнения}
|
||||||
|
Технология создания мультимедийной веб-презентации к состоит из трёх этапов:
|
||||||
|
\textbf{Первый этап.} Планирование презентации. Планирование включает:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item подготовку инструментария;
|
||||||
|
\item определение цели;
|
||||||
|
\item определение задач презентации;
|
||||||
|
\item подбор необходимой информации;
|
||||||
|
\item планирование выступления и определение необходимого времени;
|
||||||
|
\item формирование структуры презентации;
|
||||||
|
\item проверку логики подачи материала;
|
||||||
|
\item подготовку заключения.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
\textbf{Второй этап.} Разработка презентации. Разработка презентации включает:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item поиск соответствия методологических требований подготовки слайдов с проектируемыми слайдами презентации;
|
||||||
|
\item обеспечение вертикальной и горизонтальной логики содержания;
|
||||||
|
\item разработку дизайна;
|
||||||
|
\item Выбор оптимального соотношения текста и графической информации.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
\textbf{Третий этап.} Отладка и проверка презентации.
|
||||||
|
|
||||||
\section{Выполнение работы}
|
\section{Выполнение работы}
|
||||||
Для написания мультимедйного приложения был выбран Qt Framework версии 5.12, и язык C++. Разрабатываемое приложение - это единый мультимедийный просмотрщик файлов (офисные документы, pdf, видео). Для реализации мультимедийности были выбраны несколько компонентов и создан экран, основной частью которого является область просмотра.
|
\subsection{Создание основной презентации}
|
||||||
|
В редакторе файлов гипертекстовой разметки создадим презентацию по теме «Мультимедиа технологии в корпоративных информационных системах», подберем оформление слайдов в соответствии с темой презентации. Первым слайдом презентации должен быть титульный слайд, на который выносятся тема и имя автора. В случае, если авторов несколько, имя докладчика подчеркивается. Слайд с содержанием представлен на рис. \hrf{pic:title}.
|
||||||
|
|
||||||
\subsection{Функции. Открытие MPEG}
|
\begin{figure}[H]
|
||||||
Для открытия, воспроизведения и перемотки видеофайлов используются компоненты \code{QMediaPlayer} и \code{QVideoWidget}. Для работы с компонентами были описаны следующие слоты и функции:
|
\centering
|
||||||
\begin{itemize}
|
\includegraphics[width=12cm]{03-mmt-lab-02-title.png}
|
||||||
\item \code{void openMPEG(QString&)}. Достраивает в главном окне необходимые области, добавляет кнопки, инициализирует слайдеры, связывает слоты.
|
\caption{Титульный слайд}
|
||||||
\item \code{void closeMPEG()}. Отвязывает слоты, удаляет динамические объекты, очищает окно от элементов управления.
|
\label{pic:title}
|
||||||
\item \code{void playVideo()}. Начинает/продолжает проигрывание медиафайла.
|
\end{figure}
|
||||||
\item \code{void stopVideo()}. Завершает проигрывание файла. Позиция проигрывания перемещается в начало. Если после вызова этой функции вызвать \code{playVideo()}, то видео начнется сначала.
|
|
||||||
\item \code{void pauseVideo()}. Приостанавливает проигрывание медиа. Позиция сохраняется. Если после вызова этой вызвать \code{playVideo()}, то видео продолжится с момента приостановки видео.
|
|
||||||
\item \code{void changeVolume(int)}. Изменяет громкость звука. Слот вызывается сигналом \code{&QSlider::valueChanged} с передачей значения из компонента.
|
|
||||||
\item \code{void changePosition()}. Принудительно перематывает видео ползунком. При вызове слота позиции видео присваивается значение с ползунка, отвечающего за перемотку видео.
|
|
||||||
\item \code{void updatePosition(qint64)}. Слот реагирует на текущее положение курсора в проигрывателе и передает относительное положение ползунку перемотки видео, чтобы положение ползунка менялось в ходе проигрывания видео.
|
|
||||||
\item \code{void updateDuration(qint64)}. При старте видеопотока общая продолжительность видео считается некоторое время, поэтому сразу идентифицировать не удастся. Слот привязан к сигналу о том, что для данного видеофайла изменилось (вычислилось) значение продолжительности.
|
|
||||||
\item \code{void updateState(int)}. Справочный слот. Реагирует на Старт, Стоп и Паузу видео. Если необходимо в процессе работы выдавать еще какие-то команды - слот «узнаёт», в каком состоянии проигрывания медиафайл.
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsection{Функции. Открытие офисных документов (XLSX, DOCX, PPTX)}
|
На втором слайде приводится краткий план презентации (рис. \hrf{pic:toc}).
|
||||||
Функции офиса используют компонент ActiveX и отображают содержимое, фактически открытое в приложениях офисного пакета.
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=12cm]{03-mmt-lab-02-toc.png}
|
||||||
|
\caption{Содержание презентации}
|
||||||
|
\label{pic:toc}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
\begin{itemize}
|
\subsection{Использование мультимедиа}
|
||||||
\item \code{void openXLSX(QString&)}. Открывает XLSX файл и передает управление файлом приложению MS Excel. Отображение размещается внутри виджета.
|
Подбор материала для слайда необходимо вести таким образом, чтобы не перегружать его: один слайд, как правило, не должен оставаться на экране дольше одной минуты. Также не следует стремиться к слишком частой смене слайдов (рис. \hrf{pic:pic}).
|
||||||
\item \code{void openDOCX(QString&)}. Открывает DOCX файл и передает управление файлом приложению MS Word. Отображение размещается внутри виджета.
|
\begin{figure}[H]
|
||||||
\item \code{void openPPTX(QString&)}. Открывает PPTX файл и передает управление файлом приложению MS PowerPoint. Отображение размещается внутри виджета. Дополнительно, здесь происходит подключение к слоту, вызывющему проигрывание в режиме презентации.
|
\centering
|
||||||
\end{itemize}
|
\includegraphics[width=12cm]{03-mmt-lab-02-pic.png}
|
||||||
\subsection{Функции. Открытие документов PDF}
|
\caption{Изображения в презентации}
|
||||||
\code{void openPDF(QString&)}. Открывает PDF файл и передает управление файлом приложению Adobe Acrobat. Отображение размещается внутри виджета.
|
\label{pic:pic}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
\subsection{Закрытие документа}
|
Использование эффектов анимации (звука, видео) должно быть направлено исключительно на акцентирование внимания зрителя на каких-либо моментах доклада (например, рис. \hrf{pic:vid}).
|
||||||
\code{void closeFile()} - Закрывает открытый документ.
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=12cm]{03-mmt-lab-02-vid.png}
|
||||||
|
\caption{Видео в презентации}
|
||||||
|
\label{pic:vid}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\section{Контрольные вопросы}
|
||||||
|
\begin{enumerate}
|
||||||
|
\item \textbf{Для чего использовался npm? Что это такое и какие команды вы знаете?} Для запуска интерактивности веб-страницы с презентацией. npm - это пакетный менеджер и проектов для node.js.
|
||||||
|
\item \textbf{Что такое git? Кратко объясните его суть?} Это система контроля версий. Его суть в распределении хранения исходных кодов проекта.
|
||||||
|
\item \textbf{Для чего в проекте нужен git?} Для версионирования исходной презентации.
|
||||||
|
\item \textbf{В чём преимущество веб-презентации в сравнении с простой презентацией Powerpoint?} В отсутствии необходимости использовать локальный инструмент и возможности распределения работы над презентацией среди множества исполнителей.
|
||||||
|
\item \textbf{Какие есть недостатки веб-презентаций?} Необходимость устанавливать дополнительное нестандартное программное обеспечение и изучать язык разметки.
|
||||||
|
\item \textbf{Какие трудности возникают в процессе разработки веб-презентаций?} Не обнаружено.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
\section{Выводы}
|
\section{Выводы}
|
||||||
Для разработки мультимедийного приложения необходимо изучить разнообразный инструментарий, позволяющий манипулировать мультимедийными данными. Написание мультимедийнх приложений тесно связано с обработкой больших объёмов данных или использованием внешних библиотек и приложений. Мультимедийные приложения возможно написать для любых платформ и внедрить для любых категорий пользователей.
|
В ходе выполнения лабораторной работы были приобретены навыки создания мультимедийной веб-презентации, произошло ознакомление с основными правилами и требованиями к созданию веб-презентаций а также инструментарием по созданию веб-презентаций Shower. Была создана мультимедийная презентацию в соответствии с изученными требованиями по заданной теме.
|
||||||
|
|
||||||
\newpage
|
\newpage
|
||||||
\appendix
|
\appendix
|
||||||
\setcounter{secnumdepth}{0}
|
\setcounter{secnumdepth}{0}
|
||||||
\section{Приложения}
|
\section*{Приложения}
|
||||||
|
\addcontentsline{toc}{section}{Приложения}
|
||||||
\renewcommand{\thesubsection}{\Asbuk{subsection}}
|
\renewcommand{\thesubsection}{\Asbuk{subsection}}
|
||||||
|
|
||||||
\subsection{Полный листинг главного окна приложения}
|
\subsection{Полный листинг разметки презентации}
|
||||||
\begin{lstlisting}[language=C++,style=CCodeStyle]
|
\begin{lstlisting}[language=HTML,style=CCodeStyle]
|
||||||
#include "mainwindow.h"
|
<!DOCTYPE html>
|
||||||
#include "ui_mainwindow.h"
|
<html lang="en">
|
||||||
|
<head>
|
||||||
MainWindow::MainWindow(QWidget *parent) :
|
<title>МТвКИС</title>
|
||||||
QMainWindow(parent),
|
<meta charset="utf-8">
|
||||||
ui(new Ui::MainWindow)
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||||
{
|
<link rel="stylesheet" href="node_modules/@shower/ribbon/styles/styles.css">
|
||||||
ui->setupUi(this);
|
<style>
|
||||||
QMenuBar *menuBar = new QMenuBar();
|
.shower {
|
||||||
m_menuFile = menuBar->addMenu("&File");
|
--slide-ratio: calc(16 / 9);
|
||||||
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);
|
|
||||||
this->resize(800, 600);
|
|
||||||
show();
|
|
||||||
}
|
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
|
||||||
{
|
|
||||||
delete ui;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
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("MPEG (*.mpeg) ;; PDF (*.pdf) ;; DOCX (*.docx) ;; XLSX (*.xlsx) ;; PPTX (*.pptx)"));
|
|
||||||
if (m_filename != "") {
|
|
||||||
if (axObj) {
|
|
||||||
qDebug() << "Close file!\n";
|
|
||||||
closeFile();
|
|
||||||
}
|
|
||||||
if (m_videoWidget) {
|
|
||||||
qDebug() << "Close MPEG!\n";
|
|
||||||
closeMPEG();
|
|
||||||
}
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body class="shower list">
|
||||||
|
|
||||||
if (m_filename.endsWith(".pdf")) {
|
<header class="caption">
|
||||||
openPDF(m_filename);
|
<h1>Мультимедиа технологии в корпоративных информационных системах</h1>
|
||||||
} else if (m_filename.endsWith(".pptx")) {
|
<p>[ИУ3-31М] И.И.Овчинников</p>
|
||||||
openPPTX(m_filename);
|
</header>
|
||||||
} else if (m_filename.endsWith(".docx")) {
|
|
||||||
openDOCX(m_filename);
|
|
||||||
} else if (m_filename.endsWith(".xlsx")) {
|
|
||||||
openXLSX(m_filename);
|
|
||||||
} else if (m_filename.endsWith(".mpeg")) {
|
|
||||||
openMPEG(m_filename);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::closeFile() {
|
<section class="slide" id="cover">
|
||||||
if (axObj != nullptr) {
|
<h2>Мультимедиа технологии в корпоративных информационных системах</h2>
|
||||||
QProcess process;
|
<p>[ИУ3-31М] И.И.Овчинников</p>
|
||||||
QString strCmd;
|
<figure>
|
||||||
strCmd = "taskkill /im winword.exe /f";
|
<img class="cover" src="pictures/bg.jpg" alt="Background">
|
||||||
process.execute(strCmd);
|
<figcaption class="copyright right white">
|
||||||
strCmd = "taskkill /im EXCEL.exe /f";
|
<a href="https://fiftyfootshadows.net">© John Carey</a>
|
||||||
process.execute(strCmd);
|
</figcaption>
|
||||||
strCmd = "taskkill /im POWERPNT.exe /f";
|
</figure>
|
||||||
process.execute(strCmd);
|
<style>
|
||||||
strCmd = "taskkill /im AcroRd32.exe /f";
|
#cover h2 {
|
||||||
process.execute(strCmd);
|
margin: 30px 0 0;
|
||||||
process.close();
|
color: white;
|
||||||
axObj->close();
|
text-align: center;
|
||||||
axObj->clear();
|
font-size: 70px;
|
||||||
delete axObj;
|
}
|
||||||
axObj = nullptr;
|
|
||||||
qDebug() << "file closed!";
|
#cover p {
|
||||||
}
|
margin: 10px 0 0;
|
||||||
}
|
text-align: center;
|
||||||
|
color: white;
|
||||||
|
font-style: italic;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cover p a {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="slide">
|
||||||
|
<h2>В ближайшие 15 минут</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Что такое мультимедиа и корпоративная система?</li>
|
||||||
|
<li>Что можно хранить, как можно использовать и как это передавать?</li>
|
||||||
|
<li>Рынок и развитие.</li>
|
||||||
|
<li>Гипотезы и будущее.</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::openPDF(QString &filename) {
|
<section class="slide">
|
||||||
axObj = new QAxWidget(this);
|
<h2>Мультимедиа</h2>
|
||||||
setCentralWidget(axObj);
|
<figure>
|
||||||
if(!axObj->setControl("Adobe PDF Reader"))
|
<blockquote>
|
||||||
QMessageBox::critical(this, "Error", "Make sure you have Adobe Reader (and its ActiveX) installed!");
|
<p> Мультимедиа (англ. multimedia) — данные, или содержание, которые представляются одновременно в разных формах: звук, анимированная компьютерная графика, видеоряд.</p>
|
||||||
axObj->dynamicCall("LoadFile(QString)", filename);
|
</blockquote>
|
||||||
}
|
</figure>
|
||||||
|
</section>
|
||||||
|
|
||||||
/* run slideshow */
|
<section class="slide">
|
||||||
void MainWindow::playPPTX() {
|
<h2>Корпоративная Информационная Система</h2>
|
||||||
// Open parameter
|
<figure>
|
||||||
QList<QVariant> param_list;
|
<blockquote>
|
||||||
axObj->setControl("PowerPoint.Application");
|
<p>Корпоративная Информационная Система — это автоматизированная система, предназначенная для комплексной автоматизации всех видов хозяйственной деятельности компаний, а также корпораций, требующих единого управления EMS, CMS, LMS, CRM, PLM, etc... </p>
|
||||||
param_list.append(m_filename);
|
</blockquote>
|
||||||
param_list.append(1);
|
</figure>
|
||||||
param_list.append(1);
|
</section>
|
||||||
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()");
|
|
||||||
|
|
||||||
}
|
<section class="slide">
|
||||||
|
<h2>Системы ведения электронных архивов EDMS (Electronic Document Management System)</h2>
|
||||||
|
<figure>
|
||||||
|
<img src="pictures/notion.png" class="place bottom" height="50%" alt="EDMS example" />
|
||||||
|
</figure>
|
||||||
|
</section>
|
||||||
|
|
||||||
void MainWindow::openPPTX(QString &filename) {
|
<section class="slide">
|
||||||
/* инициализация окна виджетом */
|
<h2>Передача мультимедийных данных</h2>
|
||||||
m_wideWidget = new QWidget;
|
<figure>
|
||||||
setCentralWidget(m_wideWidget);
|
<img src="pictures/transport.png" class="place bottom" height="70%" alt="EDMS example" />
|
||||||
qDebug() << "1";
|
</figure>
|
||||||
/* здесь будут элементы управления и окно проигрывателя (выравнивание по горизонтали) */
|
</section>
|
||||||
m_qvBoxLayout = new QVBoxLayout(m_wideWidget);
|
|
||||||
|
|
||||||
axObj = new QAxWidget("PowerPoint.Application", m_wideWidget);
|
<section class="slide">
|
||||||
m_btnPlay = new QPushButton("Начать презентацию");
|
<h2>Системы видео-конференцсвязи</h2>
|
||||||
qDebug() << "2";
|
<ul>
|
||||||
m_qvBoxLayout->addWidget(axObj);
|
<li>В работе компаний, которые имеют разветвленную сеть филиалов - в собрании могут принимать участие сотрудники из других городов;</li>
|
||||||
m_qvBoxLayout->addWidget(m_btnPlay);
|
<li>Для проведения переговоров с клиентами из разных стран;</li>
|
||||||
|
<li>В дистанционном обучении;</li>
|
||||||
|
<li>В телемедицине;</li>
|
||||||
|
<li>В СМИ для передачи информации с места событий и др.</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
if (axObj == nullptr) {
|
<section class="slide">
|
||||||
return;
|
<h2>Примеры приложений для ВКС</h2>
|
||||||
}
|
<ul>
|
||||||
if (!axObj->setControl(filename)) {
|
<li><b>TrueConf</b> – используется для государственных и частных организаций;</li>
|
||||||
return;
|
<li><b>Zoom</b> – публичный сервис для видеосвязи корпоративная платформа, совмещающая в себе чат и Microsoft Teams;</li>
|
||||||
}
|
<li><b>Microsoft Teams</b> видеозвонки. Microsoft Teams является частью пакета Office 365 и распространяется по корпоративной подписке.</li>
|
||||||
axObj->dynamicCall("LoadFile(const QString&)", filename);
|
</ul>
|
||||||
axObj->dynamicCall("SetVisible (bool Visible)", "false");
|
</section>
|
||||||
axObj->setProperty("DisplayAlerts", false);
|
|
||||||
axObj->setProperty("DisplayScrollBars", true);
|
|
||||||
|
|
||||||
delay(1);
|
<section class="slide">
|
||||||
|
<h2>Интерактивные и мультимедийные системы обучения</h2>
|
||||||
|
<figure>
|
||||||
|
<img src="pictures/learn-dynamics.png" class="place bottom" height="65%" alt="EDMS example" />
|
||||||
|
</figure>
|
||||||
|
</section>
|
||||||
|
|
||||||
axObj->show();
|
<section class="slide">
|
||||||
axObj->raise();
|
<h2>Величина рынка развития мультимедиа в корпоративном секторе</h2>
|
||||||
qDebug() << "3";
|
<figure>
|
||||||
connect(this->m_btnPlay, &QPushButton::clicked, this, &MainWindow::playPPTX);
|
<blockquote>
|
||||||
}
|
<p>В ближайшие три года мы ожидаем взрывной рост объёма российского рынка ПО для бизнес-коммуникаций. Таким образом, общий объём рынка может достичь 100 млрд рублей</p>
|
||||||
|
</blockquote>
|
||||||
|
<figcaption>Генеральный директор tada.team Андрей Демин, в интерьвью журналу Forbes</figcaption>
|
||||||
|
</figure>
|
||||||
|
</section>
|
||||||
|
|
||||||
void MainWindow::openXLSX(QString &filename) {
|
<section class="slide">
|
||||||
axObj = new QAxWidget("Excel.Application", this);
|
<h2>Применение AR/VR в КИС и медицине</h2>
|
||||||
setCentralWidget(axObj);
|
<figure>
|
||||||
if (axObj == nullptr) {
|
<img src="pictures/beat.gif" class="place bottom left" height="45%" alt="EDMS example" />
|
||||||
return;
|
<img src="pictures/draw.gif" class="place center" height="45%" alt="EDMS example" />
|
||||||
}
|
<img src="pictures/heart.gif" class="place bottom right" height="45%" alt="EDMS example" />
|
||||||
axObj->dynamicCall("SetVisible (bool Visible)", "false");
|
</figure>
|
||||||
axObj->setProperty("DisplayAlerts", false);
|
</section>
|
||||||
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);
|
|
||||||
if (axObj == nullptr) {
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* продолжить проигрывать видео */
|
<section class="slide">
|
||||||
void MainWindow::playVideo() {
|
<h2>Применение систем для контроля логистики</h2>
|
||||||
m_player->setPosition(m_position);
|
<figure>
|
||||||
m_player->play();
|
<img src="pictures/logistic.png" class="place bottom" height="65%" alt="EDMS example" />
|
||||||
}
|
</figure>
|
||||||
|
</section>
|
||||||
|
|
||||||
/* остановка видео */
|
<section class="slide">
|
||||||
void MainWindow::stopVideo() {
|
<h2>Интеграция КИС и интернета вещей</h2>
|
||||||
m_player->stop();
|
<figure>
|
||||||
}
|
<img src="pictures/iot.png" class="place bottom" height="65%" alt="EDMS example" />
|
||||||
|
</figure>
|
||||||
|
</section>
|
||||||
|
|
||||||
/* пауза видео */
|
<section class="slide">
|
||||||
void MainWindow::pauseVideo() {
|
<h2>Выводы</h2>
|
||||||
m_player->pause();
|
<ul>
|
||||||
}
|
<li>Мультимедиа охватывают все области интеллектуальной деятельности: науку, технику, образование, бизнес, культуру</li>
|
||||||
|
<li>Корпоративные системы это не только про бизнес, но и про некоммерческие организации</li>
|
||||||
|
<li>Интеграция в жизнь людей усиливается, повсеместное использование.</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
/* событие при изменении состояния видеопроигрывателя */
|
<section class="slide">
|
||||||
void MainWindow::updateState(int state) {
|
<h2>Спасибо за внимание</h2>
|
||||||
switch (state) {
|
<figure>
|
||||||
case QMediaPlayer::PlayingState:
|
<img src="pictures/ty.png" class="place right" height="65%" alt="EDMS example" />
|
||||||
/* media is played */
|
</figure>
|
||||||
break;
|
</section>
|
||||||
|
|
||||||
case QMediaPlayer::PausedState:
|
<footer class="badge">
|
||||||
/* media paused */
|
<a href="https://t.me/ivanigorevichfeed">Follow me on Telegram</a>
|
||||||
break;
|
</footer>
|
||||||
|
|
||||||
case QMediaPlayer::StoppedState:
|
<div class="progress"></div>
|
||||||
/* media is stopped */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* принудительно изменить время проигрывания */
|
<script src="node_modules/@shower/core/dist/shower.js"></script>
|
||||||
void MainWindow::changePosition() {
|
<!-- https://docs.google.com/presentation/d/1sJmLJiJjnHjDl-TRpNyYnCTvn5zUDgE2x3ndvHampR0/edit?usp=sharing -->
|
||||||
m_position = m_sliderVideo->value();
|
|
||||||
m_player->setPosition(m_position);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* принудительно изменить время проигрывания */
|
</body>
|
||||||
void MainWindow::updatePosition(qint64 position) {
|
</html>
|
||||||
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;
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
\end{document}
|
\end{document}
|
|
@ -0,0 +1,383 @@
|
||||||
|
\documentclass[a4paper]{article}
|
||||||
|
|
||||||
|
\input{../common-preamble}
|
||||||
|
\input{../bmstu-preamble}
|
||||||
|
\input{../fancy-listings-preamble}
|
||||||
|
|
||||||
|
\numerationTop
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
\fontsize{14pt}{14pt}\selectfont % Вполне очевидно, что мы хотим 14й шрифт, все его хотят
|
||||||
|
\thispagestyle{empty}
|
||||||
|
\makeBMSTUHeader
|
||||||
|
|
||||||
|
\makeReportTitle{лабораторной}{3}{Разработка мультимедийного приложения}{Мультимедиа технологии}{}{Д.А. Видьманов}
|
||||||
|
\newpage
|
||||||
|
\thispagestyle{empty}
|
||||||
|
\tableofcontents
|
||||||
|
\newpage
|
||||||
|
\pagestyle{fancy}
|
||||||
|
\sloppy
|
||||||
|
\section{Цель}
|
||||||
|
Целью работы является приобретение навыков создания мультимедийных приложений. Создать мультимедийное приложение.
|
||||||
|
|
||||||
|
\section{Задачи}
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Установить среду разработки;
|
||||||
|
\item Описать критерии создания приложения;
|
||||||
|
\item Написать код и отладить работу приложения.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
\section{Выполнение работы}
|
||||||
|
Для написания мультимедйного приложения был выбран Qt Framework версии 5.12, и язык C++. Разрабатываемое приложение - это единый мультимедийный просмотрщик файлов (офисные документы, pdf, видео). Для реализации мультимедийности были выбраны несколько компонентов и создан экран, основной частью которого является область просмотра.
|
||||||
|
|
||||||
|
\subsection{Функции. Открытие MPEG}
|
||||||
|
Для открытия, воспроизведения и перемотки видеофайлов используются компоненты \code{QMediaPlayer} и \code{QVideoWidget}. Для работы с компонентами были описаны следующие слоты и функции:
|
||||||
|
\begin{itemize}
|
||||||
|
\item \code{void openMPEG(QString&)}. Достраивает в главном окне необходимые области, добавляет кнопки, инициализирует слайдеры, связывает слоты.
|
||||||
|
\item \code{void closeMPEG()}. Отвязывает слоты, удаляет динамические объекты, очищает окно от элементов управления.
|
||||||
|
\item \code{void playVideo()}. Начинает/продолжает проигрывание медиафайла.
|
||||||
|
\item \code{void stopVideo()}. Завершает проигрывание файла. Позиция проигрывания перемещается в начало. Если после вызова этой функции вызвать \code{playVideo()}, то видео начнется сначала.
|
||||||
|
\item \code{void pauseVideo()}. Приостанавливает проигрывание медиа. Позиция сохраняется. Если после вызова этой вызвать \code{playVideo()}, то видео продолжится с момента приостановки видео.
|
||||||
|
\item \code{void changeVolume(int)}. Изменяет громкость звука. Слот вызывается сигналом \code{&QSlider::valueChanged} с передачей значения из компонента.
|
||||||
|
\item \code{void changePosition()}. Принудительно перематывает видео ползунком. При вызове слота позиции видео присваивается значение с ползунка, отвечающего за перемотку видео.
|
||||||
|
\item \code{void updatePosition(qint64)}. Слот реагирует на текущее положение курсора в проигрывателе и передает относительное положение ползунку перемотки видео, чтобы положение ползунка менялось в ходе проигрывания видео.
|
||||||
|
\item \code{void updateDuration(qint64)}. При старте видеопотока общая продолжительность видео считается некоторое время, поэтому сразу идентифицировать не удастся. Слот привязан к сигналу о том, что для данного видеофайла изменилось (вычислилось) значение продолжительности.
|
||||||
|
\item \code{void updateState(int)}. Справочный слот. Реагирует на Старт, Стоп и Паузу видео. Если необходимо в процессе работы выдавать еще какие-то команды - слот «узнаёт», в каком состоянии проигрывания медиафайл.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsection{Функции. Открытие офисных документов (XLSX, DOCX, PPTX)}
|
||||||
|
Функции офиса используют компонент ActiveX и отображают содержимое, фактически открытое в приложениях офисного пакета.
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item \code{void openXLSX(QString&)}. Открывает XLSX файл и передает управление файлом приложению MS Excel. Отображение размещается внутри виджета.
|
||||||
|
\item \code{void openDOCX(QString&)}. Открывает DOCX файл и передает управление файлом приложению MS Word. Отображение размещается внутри виджета.
|
||||||
|
\item \code{void openPPTX(QString&)}. Открывает PPTX файл и передает управление файлом приложению MS PowerPoint. Отображение размещается внутри виджета. Дополнительно, здесь происходит подключение к слоту, вызывющему проигрывание в режиме презентации.
|
||||||
|
\end{itemize}
|
||||||
|
\subsection{Функции. Открытие документов PDF}
|
||||||
|
\code{void openPDF(QString&)}. Открывает PDF файл и передает управление файлом приложению Adobe Acrobat. Отображение размещается внутри виджета.
|
||||||
|
|
||||||
|
\subsection{Закрытие документа}
|
||||||
|
\code{void closeFile()} - Закрывает открытый документ.
|
||||||
|
|
||||||
|
|
||||||
|
\section{Выводы}
|
||||||
|
Для разработки мультимедийного приложения необходимо изучить разнообразный инструментарий, позволяющий манипулировать мультимедийными данными. Написание мультимедийнх приложений тесно связано с обработкой больших объёмов данных или использованием внешних библиотек и приложений. Мультимедийные приложения возможно написать для любых платформ и внедрить для любых категорий пользователей.
|
||||||
|
|
||||||
|
\newpage
|
||||||
|
\appendix
|
||||||
|
\setcounter{secnumdepth}{0}
|
||||||
|
\section{Приложения}
|
||||||
|
\renewcommand{\thesubsection}{\Asbuk{subsection}}
|
||||||
|
|
||||||
|
\subsection{Полный листинг главного окна приложения}
|
||||||
|
\begin{lstlisting}[language=C++,style=CCodeStyle]
|
||||||
|
#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);
|
||||||
|
this->resize(800, 600);
|
||||||
|
show();
|
||||||
|
}
|
||||||
|
|
||||||
|
MainWindow::~MainWindow()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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("MPEG (*.mpeg) ;; PDF (*.pdf) ;; DOCX (*.docx) ;; XLSX (*.xlsx) ;; PPTX (*.pptx)"));
|
||||||
|
if (m_filename != "") {
|
||||||
|
if (axObj) {
|
||||||
|
qDebug() << "Close file!\n";
|
||||||
|
closeFile();
|
||||||
|
}
|
||||||
|
if (m_videoWidget) {
|
||||||
|
qDebug() << "Close MPEG!\n";
|
||||||
|
closeMPEG();
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
} else if (m_filename.endsWith(".mpeg")) {
|
||||||
|
openMPEG(m_filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
qDebug() << "file closed!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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()");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::openPPTX(QString &filename) {
|
||||||
|
/* инициализация окна виджетом */
|
||||||
|
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)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
axObj->dynamicCall("LoadFile(const QString&)", filename);
|
||||||
|
axObj->dynamicCall("SetVisible (bool Visible)", "false");
|
||||||
|
axObj->setProperty("DisplayAlerts", false);
|
||||||
|
axObj->setProperty("DisplayScrollBars", true);
|
||||||
|
|
||||||
|
delay(1);
|
||||||
|
|
||||||
|
axObj->show();
|
||||||
|
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) {
|
||||||
|
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);
|
||||||
|
if (axObj == nullptr) {
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* продолжить проигрывать видео */
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
\end{lstlisting}
|
||||||
|
\end{document}
|
Loading…
Reference in New Issue