有什么简单的方法如何播放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播放声音,这是您的选择。如果要使用QSoundEffectQSound::QSound中有一个不错的example,该如何构造QSoundEffect以便使用资源。

10-08 11:36