有什么简单的方法如何播放Qt中资源文件中的重复/循环声音?
对于单声音播放,我可以使用它,并且效果很好:
QSound::play(":/Sounds/swoop.wav");
(WORKS)
但这不是:
QSound sound(":/Sounds/swoop.wav");
sound.play();
(DOES NOT WORK)
甚至这样:
QSound sound (":/Sounds/swoop.wav");
sound.setLoops(QSound::Infinite);
sound.play();
(DOES NOT WORK)
我想我应该使用QSoundEffect类:
QSoundEffect effect;
effect.setSource(":/Sounds/swoop.wav");
effect.setLoopCount(QSoundEffect::Infinite);
effect.setVolume(0.25f);
effect.play();
但是QSoundEffect类不适用于我必须使用的Resources文件。
我试图找到一种解决QFile的方法,但是没有成功。
我使用Qt 5.3.1
有任何想法吗?
最佳答案
很难从这个有限的代码片段中猜测出来,但是您确定所创建的QSound
的寿命足够长吗? QSound::~QSound
毕竟会调用QSound::stop
。
编辑:
有3种使用QSound的方法,让我们一起看看所有的方法:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtDebug>
#include <QSound>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton,SIGNAL(clicked()), this, SLOT(first()));
connect(ui->pushButton_2,SIGNAL(clicked()), this, SLOT(second()));
connect(ui->pushButton_3,SIGNAL(clicked()), this, SLOT(third()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::first()
{
const QString path = ui->lineEdit->text();
qDebug() << __PRETTY_FUNCTION__ << ": " << path;
QSound sound(path);
sound.play();
}
MainWindow::first
的问题在于,在创建sound
对象并立即调用其方法play
后,该对象被销毁(超出范围)。由于QSound
是在析构函数中调用的,因此很可能没有机会播放声音的任何部分。void MainWindow::third()
{
const QString path = ui->lineEdit->text();
qDebug() << __PRETTY_FUNCTION__ << ": " << path;
QSound* sound = new QSound(path);
sound->play();
}
这样,您将播放声音,但是内存泄漏,因此您需要添加某种形式的内存管理,以便在声音播放完毕后销毁
sound
对象。如果转到QSound
源,您会看到有一个名为deleteOnComplete的插槽。不幸的是,它是私有(private)的,所以您自己在这里。void MainWindow::second()
{
const QString path = ui->lineEdit->text();
qDebug() << __PRETTY_FUNCTION__ << ": " << path;
QSound::play(path);
}
最后一种情况是使用静态
play
函数。这也是最简单的方法。如果您检查它是如何实现的,它将使用我前面提到的那个专用插槽,并将其连接到专用QSoundEffect
实例数据成员的信号。您可以找到工作示例here。因此,如果您想使用
QSound
播放声音,这是您的选择。如果要使用QSoundEffect
,QSound::QSound
中有一个不错的example,该如何构造QSoundEffect
以便使用资源。