2014-10-30 156 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