如何在c ++项目中访问Qt的资源文件?

时间:2015-12-28 12:27:29

标签: c++ qt audio

我已将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播放它?我知道的唯一方法是将其作为系统中的文件播放,但这不是我需要的。

3 个答案:

答案 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。