我写了一个小的woker线程来播放Qt中的声音。 代码如下:
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将在其他地方触发。 但是,它可能会被多次触发。我想要的效果是:
无论SLOT被触发了多少次,一旦它不再被触发,声音将只播放10次。
一旦SLOT被触发并且在播放声音期间,即使收到信号,SLOT也不会被触发。
我怎么能实现这个目标?
答案 0 :(得分:1)
非常简单的解决方案,但我认为它应该有效。使用其他bool
。 Warning
:我的示例中有全局变量,我只是为了速度,避免全局变量,例如将其用作私有成员。
编辑:
我记得你的最后一个问题,如果你想获得更多的控制权(它有更多的信号和方法),我建议你使用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";
}
}