Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otchyot_k_kursovoy_sp_yaz.doc
Скачиваний:
2
Добавлен:
20.07.2019
Размер:
508.93 Кб
Скачать

Int index; слугує для переміщення по плейлисту

}

Функції класу :

Ім’я функції

Описння дії

void loop();

Слугує для зацикленого відтворення композицій з плейлиста

void _play();

Слугує для відтворення композицій з плейлиста

void _pause();

Слугує для призупинення відтворення

void _load();

Слугує для завантаження файла ( файлів ) до плейлиста

void _del();

Слугує для видалення композиції з плейлиста

Файл MyVideoWidget.h слугує для того, щоб перевизначити класс Phonon::VideoWidget. Ця потреба виникла в процесі розробки медіаплеєра. Це пов’язано з тим фактом, що виникла потреба перевизначити функції класа Phonon::VideoWidget, наприклад при переході до повноєкранного режиму.

Також у програмі було введено меню. панель керування та перевизначено клавіатурні комбінації для поліпшення роботи.

Клавіатура комбінація

Призначення

Ctrl+O

Слугує для віклику діалогу для їх добавлення до плейлиста

Alt+R

Слугує для видалення композиції з плейлиста

Alt+E

Слугує для очищення плейлиста

Alt+P

Слугує для того, щоб зберігти фрейм з відео

Alt+Q

Слугує для виходу з програми

Alt+Z

Слугує для відтворення композицій з плейлиста

Alt+X

Слугує для призупинення відтворення

Alt+C

Слугує для припинення відтворення

F4

Слугує для відображення метаданих композиції

Тестування програмного продукту

Метою проведення тестування є перевірка правильності роботи універсального програвача YMP!.

Тестування програми проводилося у міру написання її модулів в процесі відладки, при стикуванні написаних модулів і після закінчення написання програми.

Тестування програми здійснювалося на наступній апаратній платформі:

Процесор: 2x 1.9 Ггц

Об'єм оперативної пам'яті 2048 Мб

Розмір вільного дискового простору 17230000 Мб

Для тестування програми використовувалися операційні системи:

Windows Seven.

Тестування програми проводилося в наступному порядку:

1. Перевірка відповідності програми технічному завданню. При цьому перевірялася наявність і коректність виконання програмою функцій описаних в технічному завданні.

2. Перевірка правильності виконання обчислень. Для цього обчислення були заздалегідь розраховані вручну, а потім звірені з результатами програми.

3. Перевірка роботи програми з граничними значеннями. Для цього при роботі програми вводилися граничні дані, на що у відповідь від програми були отримані повідомлення про некоректність введених даних і прохання ввести їх наново.

4. Перевірка захищеності даних з якими оперує програм від сторонніх користувачів. При цьому використовувалися спроби виконати дії що приводять і змінам даних

5. Перевірка роботи усіх пунктів меню і виклику усіх екранних форм. При цьому були перевірені пункти меню на відповідність функцій виконуваних ними їх опису.

6. Перевірка роботи програми на комп'ютерах різної конфігурації. Окрім вказаної вище тестової конфігурації програма була протестована на наступній платформі:

- Процесор: 1600 Мгц

- Об'єм оперативної пам'яті 256 Мб

- Розмір вільного дискового простору 300 Мб

- Для тестування програми використовувалася операційна система: Windows 2000.

Висновок

На курсове проектування мені було запропоновано завдання: створення Універсального програвача YMP!

При розробці програмного продукту була вивчена предметна область для цього завдання, виявлені інформаційні потоки, на підставі яких була побудована діаграма потоків даних.

Універсальний програвач YMP! дозволяє:

- Відтворювати мультимедіа файли різних форматів.

- Створювати плейлисти.

- Робити знімки з відео.

Джерела інформації

  1. Макс Шлєє, - «Qt 4.5 Профессиональное программирование на С++»

  2. Ж.Бланшет, М. Саммерфілд, - «Qt 4 программирование Gui на C++»

  3. http://en.wikipedia.org/

  4. Qt Assistant

Додаток А (Лістинг програми)

//MyVideoWidget.h

#ifndef MYVIDEOWIDGET_H

#define MYVIDEOWIDGET_H

#include <QListWidget>

#include <QMainWindow>

#include <Phonon>

#include <QFileDialog>

#include <QMessageBox>

#include <QHBoxLayout>

#include <QVBoxLayout>

#include <QPushButton>

#include <QStringList>

#include <QLabel>

#include <QList>

#include <QImage>

#include <QTime>

#include <QKeyEvent>

#include <QDesktopWidget>

#include <QLCDNumber>

class MyWidget : public Phonon::VideoWidget

{

void keyPressEvent(QKeyEvent* key)

{

if(key->key()==Qt::Key_Escape)

this->setFullScreen(false);

if(key->key()==Qt::Key_F)

this->setFullScreen(false);

if(key->key()==Qt::Key_P)

if(key->modifiers() & Qt::AltModifier)

{

QString str;

str.append(QString::number(QTime::currentTime().hour()));

str.append(QString::number(QTime::currentTime().second()));

str.append(QString::number(QTime::currentTime().msec()));

str.append(".PNG");

QPixmap::grabWidget(this).save(str,"PNG");

}

}

void mouseDoubleClickEvent(QMouseEvent *me)

{

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

}

};

#endif // MYVIDEOWIDGET_H

//about.h

#ifndef ABOUT_H

#define ABOUT_H

#include <QDialog>

namespace Ui {

class about;

}

class about : public QDialog

{

Q_OBJECT

public:

explicit about(QWidget *parent = 0);

~about();

private:

Ui::about *ui;

private slots:

void on_pushButton_clicked();

};

#endif // ABOUT_H

//about.cpp

#include "about.h"

#include "ui_about.h"

about::about(QWidget *parent) :

QDialog(parent),

ui(new Ui::about)

{

ui->setupUi(this);

setWindowTitle("About...");

}

about::~about()

{

delete ui;

}

void about::on_pushButton_clicked()

{

this->close();

}

//main.cpp

#include <QtGui/QApplication>

#include "mainwindow.h"

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

MainWindow w;

w.setWindowTitle("YMP!");

a.setStyle("plastique");

QCoreApplication::setApplicationName("YMP!");

a.setApplicationVersion("1.0.0.2");

w.setWindowIcon(QPixmap(":/pref/icon.png"));

w.show();

return a.exec();

}

//mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include "about.h"

#include "MyVideoWidget.h"

#include <QListWidget>

#include <QMainWindow>

#include <Phonon>

#include <QFileDialog>

#include <QMessageBox>

#include <QHBoxLayout>

#include <QVBoxLayout>

#include <QPushButton>

#include <QStringList>

#include <QLabel>

#include <QList>

#include <QImage>

#include <QTime>

#include <QKeyEvent>

#include <QDesktopWidget>

#include <QLCDNumber>

using namespace Phonon;

namespace Ui

{

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

QMap<QString,QString> map;

Phonon::MediaObject *media;

Phonon::AudioOutput *ao;

MyWidget *m_viVid;

Phonon::SeekSlider *m_seeks;

Phonon::VolumeSlider *m_volsl;

QLabel *m_current;

QLabel *m_total;

int index;

public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

void setFullScreen(bool enabled);

private:

QString fileFilters;

Ui::MainWindow *ui;

protected:

void keyPressEvent(QKeyEvent *ke);

void resizeEvent(QResizeEvent *rev);

void timerEvent(QTimerEvent *te);

private slots:

void on_action_9_triggered();

void on_action_12_triggered();

void on_action_7_triggered();

void on_action_6_triggered();

void on_action_Qt_triggered();

void on_action_5_triggered();

void on_action_4_triggered();

void on_action_3_triggered();

void on_action_2_triggered();

void on_action_triggered();

void on_listWidget_itemDoubleClicked(QListWidgetItem* item);

void on_m_del_clicked();

void on_m_pause_clicked();

void on_m_stop_clicked();

void on_m_play_clicked();

void on_m_loadbtn_clicked();

public slots:

void loop();

void _play();

void _pause();

void _load();

void _del();

void _chStatusBar(int val);

};

#endif // MAINWINDOW_H

//mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

QString str;

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

setMinimumSize(393,240);

ui->setupUi(this);

index=0;

media=new MediaObject(this);

m_viVid=new MyWidget();

createPath(media, m_viVid);

ao=new AudioOutput(MusicCategory,this);

createPath(media, ao);

m_seeks=new Phonon::SeekSlider(media,this);

m_volsl=new Phonon::VolumeSlider(ao,this);

m_current=new QLabel(this);

m_total=new QLabel(this);

m_current->setText("00:00");

m_total->setText("00:00");

ui->statusBar->showMessage("Ready",5000);

ui->ListVideoLayout->setAlignment(ui->verticalLayout,Qt::AlignRight);

ui->ListVideoLayout->addWidget(m_viVid,1);

ui->seek_vol_Layout->addWidget(m_volsl,1);

ui->seek_vol_Layout->addWidget(m_seeks,3);

ui->seek_vol_Layout->addWidget(m_current);

ui->seek_vol_Layout->addWidget(m_total);

ui->m_play->setIcon(QPixmap(":/pref/play.png"));

ui->m_play->setIconSize(QPixmap(":/pref/play.png").size());

ui->m_pause->setIcon(QPixmap(":/pref/pause.png"));

ui->m_pause->setIconSize(QPixmap(":/pref/pause.png").size());

ui->m_stop->setIcon(QPixmap(":/pref/stop.png"));

ui->m_stop->setIconSize(QPixmap(":/pref/stop.png").size());

ui->m_loadbtn->setIcon(QPixmap(":/pref/load.png"));

ui->m_loadbtn->setIconSize(QPixmap(":/pref/load.png").size());

ui->m_del->setIcon(QPixmap(":/pref/delete.png"));

ui->m_del->setIconSize(QPixmap(":/pref/delete.png").size());

ui->mainToolBar->addWidget(ui->m_play);

ui->mainToolBar->addWidget(ui->m_pause);

ui->mainToolBar->addWidget(ui->m_stop);

ui->mainToolBar->addWidget(ui->m_loadbtn);

ui->mainToolBar->addWidget(ui->m_del);

ui->m_del->setToolTip("Delete current item");

ui->m_loadbtn->setToolTip("Open files to play");

ui->m_pause->setToolTip("Pause");

ui->m_play->setToolTip("Begin playback");

ui->m_stop->setToolTip("Stop");

m_seeks->setTracking(true);

connect(media,SIGNAL(finished()),SLOT(loop()));

}

MainWindow::~MainWindow()

{

delete ui;

}

void MainWindow::_chStatusBar(int val)

{

ui->statusBar->showMessage(QString::number(val*100)+"%");

}

void MainWindow::_load()

{

QStringList files = QFileDialog::getOpenFileNames(this,

"Select one or more files to open",

"D:\\",

tr("Audio files (*.mp3 *.wav)\n"

"Video files (*.mpg *.mpeg *.avi *.wmv)"));

QStringList tmp;

QMap<QString,QString> tempMap;

QStringListIterator sit(files);

while (sit.hasNext())

{

tmp.append(QFileInfo(sit.next()).fileName());

}

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

{

map.insert(files.at(i),tmp.at(i));

tempMap.insert(files.at(i),tmp.at(i));

}

ui->listWidget->addItems(tempMap.values());

this->setFocus();

}

void MainWindow::on_m_loadbtn_clicked()

{

_load();

}

void MainWindow::_play()

{

if(map.count()==0) return;

QString str=map.key(ui->listWidget->currentItem()->text());

index=ui->listWidget->currentRow();

if(media->state()==2)

media->stop();

media->setCurrentSource(MediaSource(str));

this->setWindowTitle(media->currentSource().fileName());

media->play();

ui->statusBar->showMessage(str);

startTimer(1000);

}

void MainWindow::on_m_play_clicked()

{

_play();

}

void MainWindow::on_m_stop_clicked()

{

media->stop();

m_current->setText("00:00");

m_total->setText("00:00");

}

void MainWindow::_pause()

{

if (media->state()==Phonon::PlayingState)

media->pause();

if (media->state()==Phonon::PausedState)

media->play();

}

void MainWindow::on_m_pause_clicked()

{

_pause();

}

void MainWindow::_del()

{

if(ui->listWidget->count()==0) return;

map.remove(map.key(ui->listWidget->currentItem()->text()));

ui->listWidget->takeItem(ui->listWidget->currentRow());

index--;

}

void MainWindow::on_m_del_clicked()

{

_del();

}

void MainWindow::on_listWidget_itemDoubleClicked(QListWidgetItem* item)

{

_play();

this->setFocus();

}

void MainWindow::keyPressEvent(QKeyEvent *ke)

{

switch(ke->key())

{

case Qt::Key_Q:

{

m_viVid->setContrast(m_viVid->contrast()+0.1);

}

case Qt::Key_A:

{

m_viVid->setContrast(m_viVid->contrast()-0.1);

}

case Qt::Key_Down:

{

if(ao->volume()==0)

ao->setVolume(0.06);

else

ao->setVolume(ao->volume()-qAbs(0.05));

break;

}

case Qt::Key_Up:

{

if(ao->volume()==1)

ao->setVolume(0.94);

else

ao->setVolume(ao->volume()+qAbs(0.05));

break;

}

case Qt::Key_Space:

{

_pause();

break;

}

case Qt::Key_Left:

{

if(ke->modifiers() & Qt::ShiftModifier)

media->seek(media->currentTime()-30000);

if(ke->modifiers() & Qt::AltModifier)

media->seek(media->currentTime()-10000);

else

media->seek(media->currentTime()-5000);

break;

}

case Qt::Key_Right:

{

if(ke->modifiers() & Qt::ShiftModifier)

media->seek(media->currentTime()+30000);

if(ke->modifiers() & Qt::AltModifier)

media->seek(media->currentTime()+10000);

else

media->seek(media->currentTime()+5000);

break;

}

case Qt::Key_F:

{

if (m_viVid->isFullScreen())

{

QMessageBox::about(0,"","out");

//this->setGeometry(m_x,m_y,m_w,m_h);

this->setGeometry(0,0,640,480);

}

else

{

m_viVid->setFullScreen(true);

this->setFocus();

};

break;

}

case Qt::Key_F4:

if(ke->modifiers() & Qt::ControlModifier)

QMessageBox::about(0,"",QString::number(this->width())+" "+QString::number(this->height()));

else

{

if(ui->listWidget->count()==0) return;

QStringList meta;

QStringList tr;

QString tmp;

tr<<"\nARTIST\t";

if(media->metaData(Phonon::ArtistMetaData).isEmpty())

meta<<"No Tag";

else

meta<<media->metaData(Phonon::ArtistMetaData);

tr<<"\nTITLE\t";

if(media->metaData(Phonon::TitleMetaData).isEmpty())

meta<<"No Tag";

else

meta<<(media->metaData(Phonon::TitleMetaData));

tr<<"\nALBUM\t";

if(media->metaData(Phonon::AlbumMetaData).isEmpty())

meta<<"No Tag";

else

meta<<(media->metaData(Phonon::AlbumMetaData));

tr<<"\nGENRE\t";

if(media->metaData(Phonon::GenreMetaData).isEmpty())

meta<<"No Tag";

else

meta<<(media->metaData(Phonon::GenreMetaData));

QStringListIterator fit(meta);

QStringListIterator sit(tr);

while (sit.hasNext())

{

tmp.append(sit.next());

tmp.append(fit.next());

}

QMessageBox::about(0,"",tmp);

}

default:QMainWindow::keyPressEvent(ke);

}

}

void MainWindow::timerEvent(QTimerEvent *te)

{

QTime m;

QTime t;

m_total->setText(t.addSecs(media->totalTime()/1000).toString("hh:mm:ss"));

m_current->setText(m.addSecs(media->currentTime()/1000).toString("hh:mm:ss"));

}

void MainWindow::resizeEvent(QResizeEvent *rev)

{

this->update();

}

void MainWindow::loop()

{

media->clear();

index = index < ui->listWidget->count() - 1 ? index + 1 : 0;

media->setCurrentSource(Phonon::MediaSource(map.key(ui->listWidget->item(index)->text())));

setWindowTitle(ui->listWidget->item(index)->text());

ui->listWidget->setCurrentRow(index);

media->play();

ui->statusBar->showMessage(media->currentSource().fileName());

}

void MainWindow::on_action_triggered()

{

_load();

}

void MainWindow::on_action_2_triggered()

{

_del();

}

void MainWindow::on_action_3_triggered()

{

_play();

}

void MainWindow::on_action_4_triggered()

{

_pause();

}

void MainWindow::on_action_5_triggered()

{

media->stop();

}

void MainWindow::on_action_Qt_triggered()

{

QMessageBox::aboutQt(0,"About Qt");

}

void MainWindow::on_action_6_triggered()

{

about *dialog=new about();

dialog->show();

}

void MainWindow::on_action_7_triggered()

{

ui->listWidget->clear();

map.clear();

QMessageBox::about(0,"YMP","<i>Playlist cleared!!!</i>");

}

void MainWindow::on_action_12_triggered()

{

this->close();

}

void MainWindow::on_action_9_triggered()

{

QString str;

str.append(QFileInfo(media->currentSource().fileName()).fileName());

str.replace(QString("."),QString("_"));

str.append(QString::number(QTime::currentTime().hour()));

str.append(QString::number(QTime::currentTime().second()));

str.append(".PNG");

QPixmap::grabWidget(m_viVid).save(str,"PNG");

qDebug()<<str;

}

26

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]