2012-03-31 104 views
1

Qtが新しく、wavファイルを計画できる簡単なqtクラスを作成しようとしていました。 読んで見回した後、私はクラスを書きました。コードは以下の通りです。音は今のplayed.Asになると、私は、アプリケーションを閉じたいQtでシンプルなサウンド(.wav)アプリケーションを再生する(C++)

1):質問は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;} 
    } 
} 

問題と質問コードの後

#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(); 
} 

に従ってくださいプログラムが動作していると言います。Qtクリエイターの "Application Output"エリアの赤いボタンを使って強制的に閉じなければなりません。 Qwidgetからclose()を使い、QApplicationからquit()を試みましたが、おそらく私は間違っています。どのようにこれをabtに行く?

2)この機能の実装は簡単ですか?あなたはイベントループを伴わない何かを知っています。私は古い学校のC++スタイルでそれをやろうとしていました。私はサウンドを演奏してやる必要があるときに関数を呼び出しますが、それをやり遂げることはできませんでした。提案は、これで大歓迎です。

おかげ

答えて

2

(私はPythonのコーダてるので)私はPyQt4を使用して答えを提供することができますが、考え方は同じです。

1)QSoundは、音を再生するための非常に基本的なインターフェイスです。それは有用なシグナルを持っていません(本当にすべきだと思いますが)。いつQSoundが完了したかを知るためには、そのisFinished()メソッドをチェックしておく必要があります。メインスレッドのループでこれを行うか、より高度なものを作成してサウンドを再生し、ループに入り、完了したら独自のカスタム信号を放射するQThreadを作成することができます。 QThreadは、メインスレッドを決してブロックしないでください。このカスタムsoundIsFinished() SIGNALを接続して、ウィジェットのclose() SLOT、または他のハンドラを言うことができます。

さらに高度なオプションが必要な場合は、phonon moduleを使用することができます。これらの信号はすべて組み込まれています。セットアップが面倒ですが、QThreadは必要ありません。

2)イベントループはQtの機能の核心概念です。メインアプリケーションは常にイベントループに入り、ウィジェットがイベントを送信して処理できるようにします。あなたは技術的にQtをイベントループなしで使用することができますが、フレームワークと戦ってその能力をすべて失うだけで本当に意味がありません。

+0

ありがとうございます!単純なQThreadやフォノンの実装の例を教えてください。どれが便利であろうと、おそらく私が説明したものに似ています。その間、Qtのドキュメントから何かを理解しようとします。 – Alok

0

アプリケーションを終了するには、最上位のウィジェットを終了する必要があります(アプリにはquitOnLastWindowClosedという名前の冗長なプロパティがありますが、これはデフォルトですので気にする必要はありません)。作成したQCoreApplicationに終了信号を送信します。 以下の例では、私は簡単な方法を取ってきました。 jdiで述べたように、スレッドを作成する方が良いでしょうが、あなたはQtを学んでいるだけであり、これを例として書いていることが分かりましたので、isFinishedを待っています。それは行くべきかの例を下:

#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. 
} 

編集:私が持っている必要がありますどのようにドキュメントを読んでいない私に恥を知れ。 QSoundにはデフォルトのコンストラクタがありません。コードを編集しました。 いくつかの注意:これはQtの使い方を習得するためのテストに過ぎないので、QSoundへのポインタを作成してから削除しました。これは良いアプローチではありません、私はそこで行ったようにポインタで遊ぶべきではない、はるかに良い解決策はあなたが使用するオブジェクトをインスタンス化するだけでしょう。手作業で削除するのは良いことではありません。そのためには、スタックに頼るのが本当に良いです。

+0

ありがとう!私はこれを試し、おそらくフォノンも試してみる。 – Alok

+0

これは驚くほど、これは機能しません。私が気づいたことの1つは、QSoundにvoidコンストラクタがないことです。それが世話をすると、問題なく構築されますが、まだ音はありません。私が以前のバージョンに戻すと、サウンドは機能します.... – Alok

+0

なぜサウンドがありませんか?番号を入力した直後にアプリケーションを終了しますか? – Castilho

関連する問題