Witam,
Pracuje z biblioteką Phonon będącą cześcią Qt.
Chciałbym zapytać czy mogę zrobić następującą rzecz:
- zatrzymać program aż zostanie wyemiitowany sygnał i zakończy się funkcja slotu, która jest powiązana z tym sygnałem.
Myślę o tym w następującej kategorii:
- wstawiam w kodzie miejsce, w którym inforumuje kompilator, że kod ma czekać aż obiekt wyemituje sygnał i wykona slot.
Mam pewną funkcję, w której są obiekty klasy Phonon::MediaObject mogące przechowywać informacje o tagach ID3. Informacje te mogą być pobrane dopiero, gdy obiekt będzie gotowy, a gdy obiekt jest gotowy to emituje sygnał meta_information_changed.
Ponieważ chcę pobierać ID3 dla więcej niż 1 pliku jednocześnie chcę dać trochę czasu MediaObject, w tym celu tymczasowo powstrzymać iterowanie po tagach (w pętli foreach, Phonon jest asynchroniczny).
void MainWindow::addFiles()
{
QStringList files = QFileDialog::getOpenFileNames(this, tr("Add music files to the library"));
if(files.empty()) return;
// z zmiennej file przechowywana jest nazwa pliku
// z ktorego odczytac chce meta dane
foreach(QString string, files) {
// QMessageBox::information(this, "string", string);
information_resolver = new Phonon::MediaObject(this);
connect(information_resolver, SIGNAL(stateChanged(Phonon::State,Phonon::State)),
SLOT(meta_information_changed(Phonon::State,Phonon::State)));
information_resolver->setCurrentSource(string);
// w tym momencie obiekt klasy Phonon::MediaObject information_resolver (wskaznik)
// za jakis czas emituje sygnal meta_information_changed(Phonon::State newState, Phonon::State oldState)
// i zaczyna wykonywac odpowiednia funkcje
// zatrzymaj program az wykona sie slot po emisji sygnalu meta_information_changed
}
}
void MainWindow::meta_information_changed(Phonon::State newState, Phonon::State oldState)
{
if (newState == Phonon::ErrorState) {
QMessageBox::warning(this, tr("Error opening files"), "Error");
return;
}
// get metadata
QStringList Title, Artist, Album, Genre, Year, Comment;
Title = information_resolver->metaData("TITLE");
Artist = information_resolver->metaData("ARTIST");
Album = information_resolver->metaData("ALBUM");
Genre = information_resolver->metaData("GENRE");
Year = information_resolver->metaData("YEAR");
QMessageBox::information(this, "Title", Title.join(" "));
// niszcze obiekt, bo jest asynchroniczny, a chce po prostu
// wypelnic go na nowo przy pobieraniu metadanych z nastepnego utworu
// i nie przejmowac sie sygnalami / slotami przy czysczeniu kolejki
information_resolver->~MediaObject();
}
Chyba, że polecicie zabrać się za to inaczej?
Dziękuje za uwagę!