C++ 如何访问Qt';c++;项目

C++ 如何访问Qt';c++;项目,c++,qt,audio,C++,Qt,Audio,我已将alert.wav声音文件添加到.qrc文件中。 然后我创建项目以生成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 |

我已将alert.wav声音文件添加到.qrc文件中。 然后我创建项目以生成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播放它?我知道的唯一方法是将其作为文件在系统上播放,但这不是我所需要的。


<RCC>
 <qresource prefix="/files">
        <file alias="alert">sounds/alert.wav</file>
 </qresource>
</RCC>
声音/警报.wav
你的.qrc文件是这样的吗?您应该尝试“:files/alert”(
prefix/alias


我帮不了你更多,我从不使用PlaySound。

你不能直接使用ressource文件,因为只有
QFile
(ohter Qt类)知道这些ressource。要播放它,您需要创建一个本地副本:

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);
请注意,临时文件夹中可能存在冲突。您可以使用自定义子目录来避免这种情况。
这种方法的有用之处在于,只有在临时文件夹中不存在文件时,才会复制该文件;如果用户删除所有临时文件,则只会再次复制该文件

提示:

如果你只想播放一个声音,可能适合你。它也不支持资源(目前),但可能更易于使用。

我认为这种方式更具代表性,因为您可以获得一个安全的、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);
}
#包括
#包括
void do_something(常量字符串和资源)
{
QFile文件(资源);
自动临时文件=QTemporaryFile::createNativeFile(文件);
自动完整路径=临时文件->文件名();
auto full_path_wstring=full_path.toStdWString();
做某事(完整路径);
}

只有Qt对象和函数可以访问Qt资源。我不知道播放声音是否可能,但对于其他情况,我通常将文件加载到QByteArray,然后使用WinAPI函数使用内存中的数据。