2012-03-31 8 views
1

Ich bin neu in Qt und versuchte, eine einfache QT-Klasse zu schreiben, die eine WAV-Datei planen kann. Nach einigem Lesen und Umschauen schrieb ich die Klasse und der Code ist wie folgt. Fragen folgen nach CodeEinfacher Sound (. WAV) Wiedergabe Anwendung in QT (C++)

#include <QtGui/QApplication> 
#include "playsound.h" 
#include <iostream> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    playSound w; 
    int ch = 2; 
    int ready = 1; 
    cout<<"ready"<<ready<<endl; 
    // w.show(); 
    w.playwav(ch); 
    return a.exec(); 
} 

Quellcode für playsound.cpp

#include "playsound.h" 

playSound::playSound(QWidget *parent): QWidget(parent) {} 

playSound::~playSound() {} 

void playSound::playwav(int ch) 
{ 

    switch (ch) 
    { 
     case 1: {QSound::play("/home/alok/qtworkspace/sounds/abc.wav"); break;} 
     case 2: {QSound::play("/home/alok/qtworkspace/sounds/xyz.wav"); break;} 
     case 3: {QSound::play("/home/alok/qtworkspace/sounds/abc.wav"); break;} 
     case 4: {QSound::play("/home/alok/qtworkspace/sounds/aaa.wav"); break;} 
     case 5: {QSound::play("/home/alok/qtworkspace/sounds/nnn.wav"); break;} 
    } 
} 

Probleme und Fragen:

1) ich die Anwendung einmal den Ton schließen wollen, ist played.As es von jetzt sagt Programm läuft und ich muss es mit dem roten Knopf im Bereich "Application Output" in Qt Creator gewaltsam schließen. Ich habe versucht, close() von Qwidget und quit() von QApplication, aber wahrscheinlich mache ich es falsch. Wie geht es weiter?

2) Kann es eine einfachere Implementierung für diese Funktionalität geben? Sie kennen etwas, das keine Ereignisschleifen beinhaltet. Ich habe versucht, es in der alten Schule C++ Art zu tun, wo ich eine Funktion rufe, wenn ich einen Ton spielen muss und damit fertig sein muss, aber es nicht geschafft habe. Vorschläge sehr willkommen auf diesem.

Dank

Antwort

2

ich eine Antwort bieten kann PyQt4 mit (da ich ein Python-Coder sind), aber die Idee ist das gleiche.

1) QSound ist eine sehr einfache Schnittstelle zum Abspielen von Sounds. Es hat keine nützlichen Signale (obwohl ich denke, dass es wirklich sollte). Um zu wissen, wann der QSound abgeschlossen ist, müssen Sie seine isFinished() Methode überprüfen. Sie können dies entweder in einer Schleife in Ihrem Hauptthread tun, oder Sie werden fortgeschrittener und erstellen einen QThread, der Ihren Sound spielt, in die Schleife geht und dann sein eigenes benutzerdefiniertes Signal ausgibt, wenn es abgeschlossen ist. Der QThread wird bevorzugt, weil Sie Ihren Haupt-Thread niemals blockieren sollten. Sie wären dann in der Lage, dieses benutzerdefinierte soundIsFinished() SIGNAL mit dem close() SLOT Ihres Widgets oder eines anderen Handlers zu verbinden.

Wenn Sie erweiterte Optionen möchten, können Sie die phonon module verwenden, die alle diese verschiedenen Signale eingebaut hat. Es ist ein bisschen nerviger einzurichten, aber dann brauchen Sie kein QThread.

2) Ereignisschleifen sind das Kernkonzept der Funktionsweise von Qt. Ihre Hauptanwendung tritt immer in eine Ereignisschleife ein, damit Widgets ihre Ereignisse veröffentlichen und verarbeiten lassen können. Sie könnten Qt ohne eine Event-Schleife technisch verwenden, aber dann ist es wirklich sinnlos, weil Sie nur gegen das Framework kämpfen und alles verlieren, was es kann.

+0

Danke !! Könnten Sie mich auf ein Beispiel einer einfachen QThread- oder Phonon-Implementierung verweisen, je nachdem, was für Sie praktisch ist und möglicherweise etwas Ähnliches wie das, was ich erklärt habe? In der Zwischenzeit werde ich versuchen, selbst etwas aus der Qt-Dokumentation zu verstehen. – Alok

0

Um eine Anwendung zu beenden, müssen Sie das Top-Level-Widget schließen (wenn Sie App haben, wird die Eigenschaft mit dem ausführlichen Namen quitOnLastWindowClosed auf true gesetzt, aber das ist der Standard, damit Sie sich keine Sorgen machen müssen) ein Quit-Signal an die von Ihnen erstellte QCoreApplication senden. Im folgenden Beispiel habe ich den einfachen Weg genommen: ein Close-Signal ausgeben. Wie von jdi gesagt, wäre es besser, einen Thread zu erstellen, aber ich habe verstanden, dass du nur Qt lernst und dies als Beispiel geschrieben hast, also ist das Warten auf isFinished gut genug. Im Folgenden ein Beispiel, wie es gehen sollte:

#include "playsound.h" 

playSound::playSound(QWidget *parent): QWidget(parent) {} 

playSound::~playSound() {} 

void playSound::playwav(int ch) 
{ 
    QSound *player = 0; // Creates an object so that you can call player.isFinished() 
        // the isFinished function is not static. 
    switch (ch) 
    { 
    case 1: {player = new QSound("/home/alok/qtworkspace/sounds/abc.wav"); break;} 
    // other cases 
    } 
    if(!player) 
     this->close(); 

    while(!player->isFinished()); // waits until the player has finished playing 
    delete player; 
    this->close(); // closes this widget, and 
        // as this Widget has no parent, i.e. it's the "top-level" widget, 
        // it'll close the app. 
} 

bearbeiten: Schande über mich nicht die Dokumentation zu lesen, wie ich haben sollte. QSound hat keinen Standardkonstruktor, ich habe den Code bearbeitet. Ein paar Anmerkungen: Da dies nur ein Test für Sie ist, um zu lernen, wie man Qt benutzt, habe ich einen Zeiger auf QSound erstellt und danach gelöscht.Dies ist kein guter Ansatz, Sie sollten nicht mit Zeigern spielen, wie ich es tat, eine viel bessere Lösung wäre nur das Objekt instanziieren, das Sie verwenden würden. Dinge manuell zu löschen, ist nicht gut, und es ist wirklich besser, sich auf den guten alten Stapel zu verlassen.

+0

Danke! Ich werde das ausprobieren und vielleicht auch phonon. – Alok

+0

So überraschend wie es ist, funktioniert das nicht. Eine Sache, die mir aufgefallen ist, ist, dass QSound keinen void-Konstruktor hat. Wenn das erledigt ist, gibt es immer noch keinen Ton, obwohl es ohne Probleme baut. Wenn ich es auf die frühere Version zurückstelle, funktioniert der Sound .... – Alok

+0

Warum gibt es keinen Ton? schließt die Anwendung sofort, nachdem Sie die Nummer eingegeben haben? – Castilho