2015-12-28 60 views
1

我在.qrc文件中添加了一個alert.wav聲音文件。 然後我qmake項目生成一個VS項目。如何訪問C++項目中的Qt資源文件?

我實際上可以在解決方案資源管理器中看到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); 

但他們沒有工作,我可以通過QSound的通過傳遞「真正發揮:文件/聲音/警報。 WAV」。 我如何通過PlaySound播放它?我知道的唯一方法就是將它作爲系統上的文件播放,但這不是我需要的。

+1

只有Qt對象和函數可以訪問qt資源。我不知道PlaySound是否可行,但在其他情況下,我通常會將文件加載到QByteArray中,然後使用WinAPI函數從內存中使用數據。 – johngull

回答

2

您不能直接使用資源文件,因爲只有QFile(其他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可能爲你工作。它也不支持資源(現在),但可能更易於使用。

0
<RCC> 
<qresource prefix="/files"> 
     <file alias="alert">sounds/alert.wav</file> 
</qresource> 
</RCC> 

您的.qrc文件是否如下所示?你應該嘗試「:files/alert」(prefix/alias)。

我幫不了你,我從來沒有使用過PlaySound。

0

我認爲這種方式更具範例性,因爲你得到一個安全的RAII風格的臨時文件。這對於您希望緩存後續重複呼叫數據的「首次呼叫」場景非常有用。

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); 
}