我已将alert.wav声音文件添加到.qrc文件中。 然后我在qmake项目中生成一个VS项目。
我实际上可以在解决方案资源管理器中看到alert.wav文件。 现在问题是使用Windows的默认API播放此alert.wav文件。
我试过这个:
PlaySound(L"alert.wav", NULL, SND_RESOURCE | SND_ASYNC | SND_NOSTOP);
和此:
PlaySound(L":files/sound/alert.wav", NULL, SND_RESOURCE | SND_ASYNC | SND_NOSTOP);
但是没有一个可以工作,我实际上可以通过传入“:files / sound / alert.wav”来播放QSound。 我怎么能通过PlaySound播放它?我知道的唯一方法是将其作为系统中的文件播放,但这不是我需要的。
答案 0 :(得分:1)
您无法直接使用ressource文件,因为只有QFile
(ohter Qt-Classes)知道这些资源。要播放它,您需要创建一个本地副本:
QString path = QDir::temp().absoluteFilePath("alert_tmp.wav");//a path in the temporary folder
QFile::copy(":files/sound/alert.wav", path);//Will return true if copied, false if the target already exists
PlaySound((wchar_t*)path.utf16(), NULL, SND_RESOURCE | SND_ASYNC | SND_NOSTOP);
请注意,您可能会在临时文件夹中发生冲突。您可以使用自定义子目录来避免这种情况 对于这种方法有用的是这样的事实:只有当文件不存在于临时文件夹中时才复制该文件,并且如果用户例如将仅复制该文件。删除所有临时文件。
<强>提示:强>
如果您只想播放声音,QSound
可能适合您。它也不支持资源(目前),但可能更容易使用。
答案 1 :(得分:1)
我认为这种方式更具范式,因为您获得了一个安全的RAII样式临时文件。这适用于“首次呼叫”场景,您希望为后续重复呼叫缓存数据。
#include <QFile>
#include <QTemporaryFile>
void do_something(const QString& resource)
{
QFile file(resource);
auto temporary_file = QTemporaryFile::createNativeFile(file);
auto full_path = temporary_file->fileName();
auto full_path_wstring = full_path.toStdWString();
do_something(full_path_wstring);
}
答案 2 :(得分:0)
<RCC>
<qresource prefix="/files">
<file alias="alert">sounds/alert.wav</file>
</qresource>
</RCC>
你的.qrc文件是这样的吗?您应该尝试&#34;:files / alert&#34; (prefix/alias
)。
我无法帮助你,我从不使用PlaySound。