2014-10-30 39 views
1

我已經寫了一個小小的遊戲線程來播放Qt中的聲音。 代碼如下:Qt:如何正確使用QSound的播放插槽?

Worker::Worker(QObject *parent) : 
    QObject(parent) 
{ 
    sound = new QSound("C:/Qt/Tools/QtCreator/bin/warning_sound/alert.wav"); 
    sound->setLoops(10); 
} 

Worker::~Worker(){ 
    delete sound; 
} 

void Worker::process() 
{ 

    sound->play(); 
} 

過程SLOT將觸發一些別的地方。 但是,它可能會被觸發多次。我想有效果是:

  1. 無論多少次的SLOT已被觸發,一旦不再觸發更多,聲音將只出場10次。

  2. 一旦SLOT被觸發並在播放聲音時,即使接收到信號,SLOT也不會再被觸發。

我怎麼能做到這一點?

回答

1

非常簡單的解決方案,但我認爲它應該起作用。使用額外的boolWarning:在我的例子中有全局變量,我這樣做只是爲了提高速度,避免全局變量,例如使用它作爲私人成員。

編輯:

我記得你,我推薦你使用QSoundEffect,如果你想獲得更多的控制權最後一個問題(它有更多的信號和方法)。所以,我現在推薦它,但你也可以用下一招用QSound

#include "worker.h" 
#include <QSound> 
#include <QDebug> 

bool active; 
QSound *sound; 
Worker::Worker(QObject *parent) : 
    QObject(parent) 
{ 
    sound = new QSound("path",this); 
    sound->setLoops(6); 
    active = false; 
} 

Worker::~Worker() 
{ 
} 

void Worker::process() 
{ 
    if(sound->isFinished()) 
     active = false; 
    if(!active) 
    { 
     sound->play(); 
     active = true; 
     qDebug() << "called"; 
    } 
} 
+0

謝謝您的回答,但我想是不是讓程序只能觸發一次。我只希望聲音還在播放時,SLOT的過程不會被觸發。 – Nyaruko 2014-10-30 18:32:21

+0

@Nyaruko請參閱我的編輯。 – Chernobyl 2014-10-30 18:37:22

+0

謝謝...我會更仔細地閱讀文檔,我沒有注意到有什麼叫做isFinished()... – Nyaruko 2014-10-30 18:39:55