<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Qt 4.6: mainwindow.cpp Example File (phonon/qmusicplayer/mainwindow.cpp)</title> <link href="classic.css" rel="stylesheet" type="text/css" /> </head> <body> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td align="left" valign="top" width="32"><a href="http://qt.nokia.com/"><img src="images/qt-logo.png" align="left" border="0" /></a></td> <td width="1"> </td><td class="postheader" valign="center"><a href="index.html"><font color="#004faf">Home</font></a> · <a href="classes.html"><font color="#004faf">All Classes</font></a> · <a href="functions.html"><font color="#004faf">All Functions</font></a> · <a href="overviews.html"><font color="#004faf">Overviews</font></a></td></tr></table><h1 class="title">mainwindow.cpp Example File<br /><span class="small-subtitle">phonon/qmusicplayer/mainwindow.cpp</span> </h1> <pre><span class="comment"> /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.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 the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ***************************************************************************/</span> #include <QtGui> #include "mainwindow.h" MainWindow::MainWindow() { audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); mediaObject = new Phonon::MediaObject(this); metaInformationResolver = new Phonon::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(metaInformationResolver, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(metaStateChanged(Phonon::State,Phonon::State))); connect(mediaObject, SIGNAL(currentSourceChanged(Phonon::MediaSource)), this, SLOT(sourceChanged(Phonon::MediaSource))); connect(mediaObject, SIGNAL(aboutToFinish()), this, SLOT(aboutToFinish())); Phonon::createPath(mediaObject, audioOutput); setupActions(); setupMenus(); setupUi(); timeLcd->display("00:00"); } void MainWindow::addFiles() { QStringList files = QFileDialog::getOpenFileNames(this, tr("Select Music Files"), QDesktopServices::storageLocation(QDesktopServices::MusicLocation)); if (files.isEmpty()) return; int index = sources.size(); foreach (QString string, files) { Phonon::MediaSource source(string); sources.append(source); } if (!sources.isEmpty()) metaInformationResolver->setCurrentSource(sources.at(index)); } 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 <span class="comment">/* oldState */</span>) { switch (newState) { case Phonon::ErrorState: if (mediaObject->errorType() == Phonon::FatalError) { QMessageBox::warning(this, tr("Fatal Error"), mediaObject->errorString()); } 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 <span class="comment">/* column */</span>) { bool wasPlaying = mediaObject->state() == Phonon::PlayingState; mediaObject->stop(); mediaObject->clearQueue(); if (row >= sources.size()) return; mediaObject->setCurrentSource(sources[row]); if (wasPlaying) mediaObject->play(); else mediaObject->stop(); } void MainWindow::sourceChanged(const Phonon::MediaSource &source) { musicTable->selectRow(sources.indexOf(source)); timeLcd->display("00:00"); } void MainWindow::metaStateChanged(Phonon::State newState, Phonon::State <span class="comment">/* oldState */</span>) { if (newState == Phonon::ErrorState) { QMessageBox::warning(this, tr("Error opening files"), metaInformationResolver->errorString()); while (!sources.isEmpty() && !(sources.takeLast() == metaInformationResolver->currentSource())) {} <span class="comment">/* loop */</span>; return; } if (newState != Phonon::StoppedState && newState != Phonon::PausedState) return; if (metaInformationResolver->currentSource().type() == Phonon::MediaSource::Invalid) return; QMap<QString, QString> metaData = metaInformationResolver->metaData(); QString title = metaData.value("TITLE"); if (title == "") title = metaInformationResolver->currentSource().fileName(); 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); if (musicTable->selectedItems().isEmpty()) { musicTable->selectRow(0); mediaObject->setCurrentSource(metaInformationResolver->currentSource()); } Phonon::MediaSource source = metaInformationResolver->currentSource(); int index = sources.indexOf(metaInformationResolver->currentSource()) + 1; if (sources.size() > index) { metaInformationResolver->setCurrentSource(sources.at(index)); } else { musicTable->resizeColumnsToContents(); if (musicTable->columnWidth(0) > 300) musicTable->setColumnWidth(0, 300); } } void MainWindow::aboutToFinish() { int index = sources.indexOf(mediaObject->currentSource()) + 1; if (sources.size() > index) { mediaObject->enqueue(sources.at(index)); } } void MainWindow::setupActions() { playAction = new QAction(style()->standardIcon(QStyle::SP_MediaPlay), tr("Play"), this); playAction->setShortcut(tr("Crl+P")); playAction->setDisabled(true); pauseAction = new QAction(style()->standardIcon(QStyle::SP_MediaPause), tr("Pause"), this); pauseAction->setShortcut(tr("Ctrl+A")); pauseAction->setDisabled(true); stopAction = new QAction(style()->standardIcon(QStyle::SP_MediaStop), tr("Stop"), this); stopAction->setShortcut(tr("Ctrl+S")); stopAction->setDisabled(true); nextAction = new QAction(style()->standardIcon(QStyle::SP_MediaSkipForward), tr("Next"), this); nextAction->setShortcut(tr("Ctrl+N")); previousAction = new QAction(style()->standardIcon(QStyle::SP_MediaSkipBackward), 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->setShortcuts(QKeySequence::Quit); 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 Phonon::SeekSlider(this); seekSlider->setMediaObject(mediaObject); volumeSlider = new Phonon::VolumeSlider(this); volumeSlider->setAudioOutput(audioOutput); volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); 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->addStretch(); 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"); }</pre> <p /><address><hr /><div align="center"> <table width="100%" cellspacing="0" border="0"><tr class="address"> <td width="40%" align="left">Copyright © 2010 Nokia Corporation and/or its subsidiary(-ies)</td> <td width="20%" align="center"><a href="trademarks.html">Trademarks</a></td> <td width="40%" align="right"><div align="right">Qt 4.6.3</div></td> </tr></table></div></address></body> </html>