有什么简单的方法可以在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
播放声音,这是您的选择。如果你想使用 QSoundEffect
,QSound::QSound
中有一个很好的例子 如何构造QSoundEffect
以便它将使用资源。