Home · All Classes · Main Classes · Grouped Classes · Modules · Functions

mainwindow.cpp Example File
phonon/musicplayer/mainwindow.cpp

 /****************************************************************************
 **
 ** Copyright (C) 2007-2007 Trolltech ASA. All rights reserved.
 **
 ** This file is part of the example classes of the Qt Toolkit.
 **
 ** This file may be used under the terms of the GNU General Public
 ** License version 2.0 as published by the Free Software Foundation
 ** and appearing in the file LICENSE.GPL included in the packaging of
 ** this file.  Please review the following information to ensure GNU
 ** General Public Licensing requirements will be met:
 ** http://trolltech.com/products/qt/licenses/licensing/opensource/
 **
 ** If you are unsure which license is appropriate for your use, please
 ** review the following information:
 ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
 ** or contact the sales department at sales@trolltech.com.
 **
 ** In addition, as a special exception, Trolltech gives you certain
 ** additional rights. These rights are described in the Trolltech GPL
 ** Exception version 1.0, which can be found at
 ** http://www.trolltech.com/products/qt/gplexception/ and in the file
 ** GPL_EXCEPTION.txt in this package.
 **
 ** In addition, as a special exception, Trolltech, as the sole copyright
 ** holder for Qt Designer, grants users of the Qt/Eclipse Integration
 ** plug-in the right for the Qt/Eclipse Integration to link to
 ** functionality provided by Qt Designer and its related libraries.
 **
 ** Trolltech reserves all rights not expressly granted herein.
 **
 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 **
 ***************************************************************************/

 #include <QtGui>

 #include "mainwindow.h"

 MainWindow::MainWindow()
 {
     audioOutput = new AudioOutput(Phonon::MusicCategory);
     mediaObject = new MediaObject(this);

     mediaObject->setTickInterval(1000);

     connect(mediaObject, SIGNAL(tick(qint64)), this, SLOT(tick(qint64)));
     connect(mediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)),
             this, SLOT(stateChanged(Phonon::State, Phonon::State)));
     connect(mediaObject, SIGNAL(currentSourceChanged(const MediaSource &)),
             this, SLOT(sourceChanged(const MediaSource &)));

     createPath(mediaObject, audioOutput);

     setupActions();
     setupMenus();
     setupUi();
     timeLcd->display("00:00");
 }

 void MainWindow::addFiles()
 {
     MediaObject metaProvider(this);
     connect(&metaProvider, SIGNAL(stateChanged(Phonon::State, Phonon::State)),
             this, SLOT(stateChanged(Phonon::State, Phonon::State)));

     QStringList files = QFileDialog::getOpenFileNames(this,
                         tr("Select Music Files"), ".");

     if (files.isEmpty())
         return;

     foreach (QString string, files) {
         MediaSource source(string);

         metaProvider.setCurrentSource(source);
         metaProvider.pause();

         QMap <QString, QString> metaData = metaProvider.metaData();

         QString title = metaData.value("TITLE");
         if (title == "")
                 title = string;

         QTableWidgetItem *titleItem = new QTableWidgetItem(title);
         titleItem->setFlags(titleItem->flags() ^ Qt::ItemIsEditable);
         QTableWidgetItem *artistItem = new QTableWidgetItem(metaData.value("ARTIST"));
         artistItem->setFlags(artistItem->flags() ^ Qt::ItemIsEditable);
         QTableWidgetItem *albumItem = new QTableWidgetItem(metaData.value("ALBUM"));
         albumItem->setFlags(albumItem->flags() ^ Qt::ItemIsEditable);
         QTableWidgetItem *yearItem = new QTableWidgetItem(metaData.value("DATE"));
         yearItem->setFlags(yearItem->flags() ^ Qt::ItemIsEditable);
         int currentRow = musicTable->rowCount();
         musicTable->insertRow(currentRow);
         musicTable->setItem(currentRow, 0, titleItem);
         musicTable->setItem(currentRow, 1, artistItem);
         musicTable->setItem(currentRow, 2, albumItem);
         musicTable->setItem(currentRow, 3, yearItem);

         sources.append(source);
     }
     if (musicTable->selectedItems().isEmpty()) {
             musicTable->selectRow(0);
             mediaObject->setCurrentSource(sources.at(0));
             enqueueFrom(0);
     } else {
         mediaObject->clearQueue();
         enqueueFrom(sources.indexOf(mediaObject->currentSource()));
     }

     musicTable->resizeColumnsToContents();
 }

 void MainWindow::about()
 {
     QMessageBox::information(this, tr("About Music Player"),
         tr("The Music Player example shows how to use Phonon - the multimedia"
            " framework that comes with Qt - to create a simple music player."));
 }

 void MainWindow::stateChanged(Phonon::State newState, Phonon::State /* oldState */)
 {
     switch (newState) {
         case Phonon::ErrorState:
             if (mediaObject->errorType() == Phonon::FatalError) {
                 QMessageBox::warning(this, tr("Fatal Error"),
                 mediaObject->errorString() + tr("\n\nTerminating Program"));
                 this->close();
             } else {
                 QMessageBox::warning(this, tr("Error"),
                 mediaObject->errorString());
             }
             break;
         case Phonon::PlayingState:
                 playAction->setEnabled(false);
                 pauseAction->setEnabled(true);
                 stopAction->setEnabled(true);
                 break;
         case Phonon::StoppedState:
                 stopAction->setEnabled(false);
                 playAction->setEnabled(true);
                 pauseAction->setEnabled(false);
                 timeLcd->display("00:00");
                 break;
         case Phonon::PausedState:
                 pauseAction->setEnabled(false);
                 stopAction->setEnabled(true);
                 playAction->setEnabled(true);
                 break;
         case Phonon::BufferingState:
                 break;
         default:
             ;
     }
 }

 void MainWindow::tick(qint64 time)
 {
     QTime displayTime(0, (time / 60000) % 60, (time / 1000) % 60);

     timeLcd->display(displayTime.toString("mm:ss"));
 }

 void MainWindow::tableClicked(int row, int /* column */)
 {
     bool wasPlaying = mediaObject->state() == Phonon::PlayingState;

     mediaObject->stop();
     mediaObject->clearQueue();

     mediaObject->setCurrentSource(sources[row]);
     enqueueFrom(row);

     if (wasPlaying)
         mediaObject->play();
     else
         mediaObject->stop();
 }

 void MainWindow::sourceChanged(const MediaSource &source)
 {
     musicTable->selectRow(sources.indexOf(source));
     timeLcd->display("00:00");
 }

 void MainWindow::enqueueFrom(int row)
 {
     mediaObject->setCurrentSource(sources[row]);
     for (int i = 1; i < sources.size(); ++i) {
         mediaObject->enqueue(sources[(i+row) % sources.size()]);
     }
 }

 void MainWindow::setupActions()
 {
     playAction = new QAction(QIcon("images/play.png"), tr("Play"), this);
     playAction->setShortcut(tr("Crl+P"));
     playAction->setDisabled(true);
     pauseAction = new QAction(QIcon("images/pause.png"), tr("Pause"), this);
     pauseAction->setShortcut(tr("Ctrl+A"));
     pauseAction->setDisabled(true);
     stopAction = new QAction(QIcon("images/stop.png"), tr("Stop"), this);
     stopAction->setShortcut(tr("Ctrl+S"));
     stopAction->setDisabled(true);
     nextAction = new QAction(QIcon("images/next.png"), tr("Next"), this);
     nextAction->setShortcut(tr("Ctrl+N"));
     previousAction = new QAction(QIcon("images/previous.png"), tr("Previous"), this);
     previousAction->setShortcut(tr("Ctrl+R"));
     addFilesAction = new QAction(tr("Add &Files"), this);
     addFilesAction->setShortcut(tr("Ctrl+F"));
     exitAction = new QAction(tr("E&xit"), this);
     exitAction->setShortcut(tr("Ctrl+X"));
     aboutAction = new QAction(tr("A&bout"), this);
     aboutAction->setShortcut(tr("Ctrl+B"));
     aboutQtAction = new QAction(tr("About &Qt"), this);
     aboutQtAction->setShortcut(tr("Ctrl+Q"));

     connect(playAction, SIGNAL(triggered()), mediaObject, SLOT(play()));
     connect(pauseAction, SIGNAL(triggered()), mediaObject, SLOT(pause()) );
     connect(stopAction, SIGNAL(triggered()), mediaObject, SLOT(stop()));
     connect(addFilesAction, SIGNAL(triggered()), this, SLOT(addFiles()));
     connect(exitAction, SIGNAL(triggered()), this, SLOT(close()));
     connect(aboutAction, SIGNAL(triggered()), this, SLOT(about()));
     connect(aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
 }

 void MainWindow::setupMenus()
 {
     QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
     fileMenu->addAction(addFilesAction);
     fileMenu->addSeparator();
     fileMenu->addAction(exitAction);

     QMenu *aboutMenu = menuBar()->addMenu(tr("&Help"));
     aboutMenu->addAction(aboutAction);
     aboutMenu->addAction(aboutQtAction);
 }

 void MainWindow::setupUi()
 {
     QToolBar *bar = new QToolBar;

     bar->addAction(playAction);
     bar->addAction(pauseAction);
     bar->addAction(stopAction);

     seekSlider = new SeekSlider(this);
     seekSlider->setMediaObject(mediaObject);

     volumeSlider = new VolumeSlider(this);
     volumeSlider->setAudioOutput(audioOutput);

     QLabel *volumeLabel = new QLabel;
     volumeLabel->setPixmap(QPixmap("images/volume.png"));

     QPalette palette;
     palette.setBrush(QPalette::Light, Qt::darkGray);

     timeLcd = new QLCDNumber;
     timeLcd->setPalette(palette);

     QStringList headers;
     headers << tr("Title") << tr("Artist") << tr("Album") << tr("Year");

     musicTable = new QTableWidget(0, 4);
     musicTable->setHorizontalHeaderLabels(headers);
     musicTable->setSelectionMode(QAbstractItemView::SingleSelection);
     musicTable->setSelectionBehavior(QAbstractItemView::SelectRows);
     connect(musicTable, SIGNAL(cellPressed(int, int)),
             this, SLOT(tableClicked(int, int)));

     QHBoxLayout *seekerLayout = new QHBoxLayout;
     seekerLayout->addWidget(seekSlider);
     seekerLayout->addWidget(timeLcd);

     QHBoxLayout *playbackLayout = new QHBoxLayout;
     playbackLayout->addWidget(bar);
     playbackLayout->addWidget(volumeLabel);
     playbackLayout->addWidget(volumeSlider);

     QVBoxLayout *mainLayout = new QVBoxLayout;
     mainLayout->addWidget(musicTable);
     mainLayout->addLayout(seekerLayout);
     mainLayout->addLayout(playbackLayout);

     QWidget *widget = new QWidget;
     widget->setLayout(mainLayout);

     setCentralWidget(widget);
     setWindowTitle("Phonon Music Player");
 }


Copyright © 2007 Trolltech Trademarks
Qt 4.4.0-tp1