gpt4 book ai didi

c++ - 如何同步制作QSound?

转载 作者:行者123 更新时间:2023-11-30 03:30:16 24 4
gpt4 key购买 nike

如何同步制作QSound?

我有一个退出按钮。如果我点击它我想播放声音然后退出程序。 QSound是异步的,不知道怎么弄成同步的。

最佳答案

你真的不需要同步播放声音。任何可能阻塞 GUI 线程超过 0.10 秒的事情都不应该在那里完成,看看 here获取更多信息。

既然你愿意在用户点击退出按钮时播放声音,我认为使用 QSoundEffect更适合你的情况,来自 docs :

This class allows you to play uncompressed audio files (typically WAV files) in a generally lower latency way, and is suitable for "feedback" type sounds in response to user actions (e.g. virtual keyboard sounds, positive or negative feedback for popup dialogs, or game sounds).

QSoundEffect 有一个信号 playingChanged()仅当声音播放完毕时,您才能利用它关闭应用程序。我不知道为什么 QSound 没有类似的信号。

这是一个最小的例子,解释了如何做到这一点:

#include <QtWidgets>
#include <QtMultimedia>

class Widget : public QWidget {
public:
explicit Widget(QWidget* parent= nullptr):QWidget(parent) {
//set up layout
layout.addWidget(&exitButton);
//initialize sound effect with a sound file
exitSoundEffect.setSource(QUrl::fromLocalFile("soundfile.wav"));
//play sound effect when Exit is pressed
connect(&exitButton, &QPushButton::clicked, &exitSoundEffect, &QSoundEffect::play);
//close the widget when the sound effect finishes playing
connect(&exitSoundEffect, &QSoundEffect::playingChanged, this, [this]{
if(!exitSoundEffect.isPlaying()) close();
});
}
~Widget() = default;
private:
QVBoxLayout layout{this};
QPushButton exitButton{"Exit"};
QSoundEffect exitSoundEffect;
};

//sample application
int main(int argc, char* argv[]){
QApplication a(argc, argv);

Widget w;
w.show();

return a.exec();
}

请注意,上述解决方案在音效播放完毕之前不会关闭窗口。

另一种方法似乎对应用程序用户更敏感,即关闭窗口,在窗口关闭时播放声音,然后在播放完毕后退出应用程序。但这需要在应用程序级别 (quitOnLastWindowClosed) 关闭最后一个窗口时禁用隐式退出。

作为禁用隐式退出的结果,您必须在程序的每个可能的退出路径上添加 qApp->quit();。这是显示第二种方法的示例:

#include <QtWidgets>
#include <QtMultimedia>

class Widget : public QWidget {
public:
explicit Widget(QWidget* parent= nullptr):QWidget(parent) {
//set up layout
layout.addWidget(&exitButton);
//initialize sound effect with a sound file
exitSoundEffect.setSource(QUrl::fromLocalFile("soundfile.wav"));
//play sound effect and close widget when exit button is pressed
connect(&exitButton, &QPushButton::clicked, &exitSoundEffect, &QSoundEffect::play);
connect(&exitButton, &QPushButton::clicked, this, &Widget::close);
//quit application when the sound effect finishes playing
connect(&exitSoundEffect, &QSoundEffect::playingChanged, this, [this]{
if(!exitSoundEffect.isPlaying()) qApp->quit();
});
}
~Widget() = default;
private:
QVBoxLayout layout{this};
QPushButton exitButton{"Exit"};
QSoundEffect exitSoundEffect;
};

//sample application
int main(int argc, char* argv[]){
QApplication a(argc, argv);
//disable implicit quit when last window is closed
a.setQuitOnLastWindowClosed(false);

Widget w;
w.show();

return a.exec();
}

关于c++ - 如何同步制作QSound?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45118886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com