русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Наполнение действий функционалом


Дата добавления: 2015-07-04; просмотров: 1084; Нарушение авторских прав


 

1. Начнем с действия action_Open: по нажатию на соответствующую клавишу добавим следующий код:

if (qsDataPath == NULL) qsDataPath = qsAppPath;

QString fileName = QFileDialog::getOpenFileName(this, QString("Open music and video files"),

qsDataPath, tr( "Media files (*.vob *.mpg *.mpeg *.mp4 *.wmv *.avi) " ) );

 

if (!fileName.isEmpty()) {

player->setMedia(QUrl::fromLocalFile(fileName));

ui->action_Play->setEnabled(true);

}

Как видно следует описать еще несколько переменных (в описании класса):

QString qsDataPath;

QString qsAppPath;

QMediaPlayer *player;

Соответственно подключим необходимые библиотеки:

#include <QMediaPlayer>

#include <QFileDialog>

Объекты следует создать:

player = new QMediaPlayer(this);

 

Самостоятельная работа: давайте сразу сделаем так, чтобы функция открытия файла запоминала, где мы были в последний раз, и по умолчанию открывала нам именно этот каталог.

 

3. Теперь создадим (и сразу же програмно добавим его на форму) виджет, в котором мы и будем проигрывать видео, сделаем это в конструкторе:

videoWidget = new QVideoWidget(this);

player = new QMediaPlayer(this);

player->setVideoOutput(videoWidget);

ui->verticalLayout->addWidget(videoWidget);

и опишем его заголовочном файле:

QVideoWidget *videoWidget;

а также подключим:

#include <QWidget>

#include <QVideoWidget>

 

4. Теперь создадим событие на нажатие клавиши Воспроизведение:

switch(player->state()) {

case QMediaPlayer::PlayingState:

player->pause(); break;

default:

player->play(); break;

}

 

5. Допишите в открытие файла:

player->play();

теперь видео будет сразу запускаться после открытия файла.

 

6. Скомпонуйте форму и скройте таблицу (в конструкторе):



ui->tableWidget->hide();

 

Все! Видеоплеер готов!

Ура! Фанфары и тестирование. Попробуйте, например, нажать кнопку Открыть и посмотрите видео…

 

Подсказка: видео Вы можете найти в «LabPract/Qt/Video».

Это важно: скопируйте видео из сети на локальный носитель.

7.1. Премотка.

Ползунок для перемотки будем добавлять на отдельную панель инструментов: для этого нажмите ПКМ в инспекторе объектов на MainWindow (рис. 6.4).

 

Рис. 6.4. Добавление еще одной панели инструментов

 

Если мы хотим перескочить сразу на середину фильма, то в помощь Вам придут:

//Перемотка

slider = new QSlider(Qt::Horizontal, this);

ui->toolBar->addWidget(slider);

connect(slider, SIGNAL(sliderMoved(int)), this, SLOT(setPosition(int)));

connect(player, SIGNAL(durationChanged(qint64)), this, SLOT(durationChanged(qint64)));

slider->setRange(0, player->duration() / 1000);

Т.к. типы qint64 и int несколько плохо взаимодействуют в режиме сигнал-слот – создадим собственные слоты.

void MainWindow::setPosition(int position)

{

player->setPosition(position/1000);

}

 

void MainWindow::durationChanged(qint64 duration)

{

this->duration = duration/1000;

slider->setMaximum(duration / 1000);

}

Не забудьте их описать в заголовочном файле (в секции слотов):

void setPosition(int position);

void durationChanged(qint64 duration);

Две прежде незнакомых компилятору переменных следует описать в классе:

QSlider *slider;

qint64 duration;

и подключить соответствующие модули:

#include <QtWidgets>

 

7.2. Таймер воспроизведения.

Для таймера необходима текстовая переменная, куда мы будем выводить время (ее необходимо описать в классе):

QLabel *labelDuration;

В конструкторе же создадим ее, добавим на панель и подключим слоты:

labelDuration = new QLabel(this);

ui->toolBar->addWidget(labelDuration);

connect(slider, SIGNAL(sliderMoved(int)), this, SLOT(seek(int)));

connect(player, SIGNAL(positionChanged(qint64)), SLOT(positionChanged(qint64)));

Собственно реализация слотов:

void MainWindow::seek(int seconds)

{

player->setPosition(seconds * 1000);

}

 

void MainWindow::positionChanged(qint64 progress)

{

if (!slider->isSliderDown()) {

slider->setValue(progress / 1000);

}

updateDurationInfo(progress / 1000);

}

void MainWindow::updateDurationInfo(qint64 currentInfo)

{

QString tStr;

if (currentInfo || duration) {

QTime currentTime((currentInfo/3600)%60, (currentInfo/60)%60, currentInfo%60, (currentInfo*1000)%1000);

QTime totalTime((duration/3600)%60, (duration/60)%60, duration%60, (duration*1000)%1000);

QString format = "mm:ss";

if (duration > 3600)

format = "hh:mm:ss";

tStr = currentTime.toString(format) + " / " + totalTime.toString(format);

}

labelDuration->setText(tStr);

}

В классе необходимо подключить эти два слота (в секции слотов):

void seek(int seconds);

void positionChanged(qint64 progress);

и процедуру (в секции private):

void updateDurationInfo(qint64 currentInfo);

 

8. Громкость

Для отключения звука добавьте еще одно действие action_Mute, установите галочку «триггерное». Перейдите к слоту (рис. 6.5), напишите:

 

Рис. 6.5. Задание действия для выключения звука

player->setMuted(checked);

Если мы хотим изменить громкость воспроизводимого (в конструкторе):

volumeSlider = new QSlider(Qt::Horizontal, this);

volumeSlider->setRange(0, 100);

ui->mainToolBar->addWidget(volumeSlider);

connect(volumeSlider, SIGNAL(sliderMoved(int)), player, SLOT(setVolume(int)));

volumeSlider->setValue(100);

В описании класса:

QAbstractSlider *volumeSlider;

 

Протестируйте приложение еще раз.

 

9. Полноэкранный просмотр

Пришла пора создать самую полезную кнопку – На весь экран. Итак, добавим сие действие в меню и на панель инструментов, установим ему свойство триггерное и создадим обработчик сего действия:

videoWidget->setFullScreen(!videoWidget->isFullScreen());

На полный экран у Вас теперь видео будет раскрыватся, но вот обратно – никак. Все дело в том, что videoWidget, раскрывшись на весь экран, стал «круче», чем MainWindow, и теперь нам надо работать именно с ним.

Для этого нам нужно описать (естественно в заголовочном файле) свой собственный класс (типа QVideoWidget):

class VideoWidget : public QVideoWidget

{

Q_OBJECT

public:

explicit VideoWidget(QWidget * parent = 0);

protected:

void keyPressEvent(QKeyEvent *event);

void mouseDoubleClickEvent(QMouseEvent *event);

};

Реализация этого класса:

VideoWidget::VideoWidget(QWidget *parent)

{

setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);

QPalette p = palette();

p.setColor(QPalette::Window, Qt::black);

setPalette(p);

setAttribute(Qt::WA_OpaquePaintEvent);

}

 

void VideoWidget::keyPressEvent(QKeyEvent *event)

{

setFullScreen(false);

}

void VideoWidget::mouseDoubleClickEvent(QMouseEvent *event)

{

setFullScreen(!isFullScreen());

event->accept();

}

Осталось лишь заменить videoWidget = new QVideoWidget(this); на

videoWidget = new VideoWidget(this);

 


Рис. 6.6. Полноэкранный просмотр

 

10. Создание плейлиста.

Допишем в конструкторе:

playlist = new QMediaPlaylist();

player->setPlaylist(playlist);

Еже ли мы будем работать со списком файлов, то кардинально поменяется процедура открытия файла (теперь их будет несколько).

QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Open Files"), "C:\\TEMP");

foreach (QString const &argument, fileNames)

{

QFileInfo fileInfo(argument);

if (fileInfo.exists()) {

QUrl url = QUrl::fromLocalFile(fileInfo.absoluteFilePath());

if (fileInfo.suffix().toLower() == QLatin1String("m3u")) {playlist->load(url);}

else playlist->addMedia(url);}

else {

QUrl url(argument);

if (url.isValid()) {playlist->addMedia(url);}

}

}

player->setMedia(playlist->media(0));

player->play();

ui->tableWidget->show();

if (ui->tableWidget->columnCount() == 0){ui->tableWidget->insertColumn(0);}

int size = fileNames.size();

int currentRow = ui->tableWidget->rowCount();

for (int i = 0; i < size; ++i)

{

ui->tableWidget->insertRow(currentRow);

QTableWidgetItem *item = new QTableWidgetItem();

item->setText(QFileInfo(fileNames[i]).fileName());

ui->tableWidget->setItem(currentRow, 0, item);

++currentRow;

}

ui->tableWidget->setColumnWidth(0, this->width());

if (ui->tableWidget->currentRow() < 0){ui->tableWidget->setCurrentItem(ui->tableWidget->item(0, 0));}

}



<== предыдущая лекция | следующая лекция ==>
Разработка формы | Самостоятельная работа (п. 11-12).


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.189 сек.