Qt 5在用户输入时播放wav声音

时间:2018-04-19 10:44:21

标签: c++ qt input wav

当程序发生时,我的程序会提醒用户。为了引起他的注意,会播放警报声。当用户输入确认收据的内容时,它会停止。

但是QTextStream输入会阻止声音! 当我删除它时,声音播放完美。

此外,"警报" QSound对象不起作用。唯一的方法是使用静态函数QSound :: play(" file.wav")。但它无法停止。

这是我的代码:

#include <QCoreApplication>
#include <QSound>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    /*
    QSound alert("../SoundAlerte/alert.wav");
    alert.setLoops(QSound::Infinite);
    alert.play();
    */

    QSound::play("../SoundAlerte/alert.wav");

    qDebug() << "ALERT";
    qDebug() << "Enter Something to confirm receipt" ;

    QTextStream s(stdin);
    QString value = s.readLine();

    qDebug() << "Received !";

    //alert.stop();

    qDebug() << "Sound stopped";

    return a.exec();
}

似乎它无法播放声音并同时等待输入!

您对如何继续进行了解吗?

由于

1 个答案:

答案 0 :(得分:1)

QSound::play是异步的,但是

QString value = s.readLine();

包含do-while并将阻止音频文件。请参阅readLine()

调用的scan function

一个工作示例是QtConcurrent,但您无法停止音频文件,因此您可能希望切换到真正的QThread方法。

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFuture<void> future = QtConcurrent::run([]() {
        QSoundEffect effect;
        QEventLoop loop;
        effect.setSource(QUrl::fromLocalFile("C:\\piano2.wav"));
        effect.setVolume(0.25f);
        effect.play();
        QObject::connect(&effect, &QSoundEffect::playingChanged, [&loop]() { qDebug() << "finished"; loop.exit(); });
        loop.exec();
    });

    QTextStream s(stdin);
    QString value = s.readLine();

    return a.exec();
}