如何在Qt中重复/循环播放来自资源文件的声音



有什么简单的方法可以在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类不适用于我必须使用的资源文件。我试图找到解决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 的插槽。不幸的是,它是私人的,所以你自己在这里。

void MainWindow::second()
{
    const QString path = ui->lineEdit->text();
    qDebug() << __PRETTY_FUNCTION__ << ": " << path;
    QSound::play(path);
}

最后一种情况是使用静态play函数。这也是最简单的方法。如果您检查它是如何实现的,它会使用我之前提到的专用槽,并将其连接到来自私有QSoundEffect实例数据成员的信号。您可以在此处找到工作示例。

因此,如果您想使用QSound播放声音,这是您的选择。如果你想使用 QSoundEffectQSound::QSound 中有一个很好的例子 如何构造QSoundEffect以便它将使用资源。

相关内容

  • 没有找到相关文章

最新更新