Погоди я тебе вечером отвечу после работы. Механизм через QEventLoop::exec()/quit() забудь как страшный сон. Это самый неправильный вариант который только можно придумать. Максимум он для юнит тестов подходит, но не для нормального кода.
Пользователь решил продолжить мысль 21 Июня 2010, 22:59:27:
Вобщем, тебе нужно в слоте законнекченом с сигналом metaDataChanged() открывать вызывать setCurrentSource на следующий элемент списка.
Простой пример:
queuewidget.h
#ifndef QueueWidget_H_
#define QueueWidget_H_
#include <QtCore/QStringList>
#include <QtGui/QWidget>
namespace Ui {
class QueueWidget;
}
namespace Phonon {
class MediaObject;
}
class QueueWidget: public QWidget {
Q_OBJECT
public:
explicit QueueWidget(QWidget *parent = 0);
virtual ~QueueWidget();
private slots:
void on_open_clicked();
void onMetadataChanged();
private:
Q_DISABLE_COPY(QueueWidget);
void enqueNext();
Ui::QueueWidget * const ui;
Phonon::MediaObject *media;
QStringList files;
int pos;
};
#endif // QueueWidget_H_
queuewidget.cpp
#include "queuewidget.h"
#include "ui_queuewidget.h"
#include <QtGui/QFileDialog>
#include <Phonon/MediaObject>
QueueWidget::QueueWidget(QWidget *parent):
QWidget(parent),
ui(new Ui::QueueWidget) {
ui->setupUi(this);
media = new Phonon::MediaObject(this);
pos = 0;
connect( media,SIGNAL(metaDataChanged()),
this,SLOT(onMetadataChanged()) );
}
QueueWidget::~QueueWidget() {
delete ui;
}
void QueueWidget::onMetadataChanged() {
QStringList data = media->metaData(Phonon::ArtistMetaData);
data << media->metaData(Phonon::AlbumMetaData);
data << media->metaData(Phonon::TitleMetaData);
data << media->metaData(Phonon::DateMetaData);
ui->list->addItem( data.join(" - ") );
enqueNext();
}
void QueueWidget::on_open_clicked() {
files = QFileDialog::getOpenFileNames(this,"Open media files");
if ( files.isEmpty() ) return;
media->clearQueue();
pos = 0;
ui->list->clear();
enqueNext();
}
void QueueWidget::enqueNext()
{
if ( pos<files.size() ) {
ui->open->setEnabled(false);
media->setCurrentSource(files[pos]);
pos++;
} else {
ui->open->setEnabled(true);
}
}
queuewidget.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QueueWidget</class>
<widget class="QWidget" name="QueueWidget">
<property name="windowTitle">
<string>Queue</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QListWidget" name="list"/>
</item>
<item>
<widget class="QPushButton" name="open">
<property name="text">
<string>Open files</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>