2017-03-06 82 views
1

我有一個Qt程序,裏面有一些.txt文件。一開始我只是從我製作的某個目錄中讀取它們,但時機已到,並且有必要爲Mac OSX創建一個包。在cmake的幫助下,我設法將.txt文件放在/ Resources的.app目錄中,但是我沒有找到如何從那裏讀取它們。Qt從Resources Bundle Directory讀取文件

如何讀取這些文件,以便我可以從任何地方運行該應用程序?

+0

如果您希望應用程序是跨平臺的,您最好使用[Qt的資源系統](http://doc.qt.io/qt-5/resources.html)而不是Mac-特定應用程序包。 – MrEricSir

+0

@MrEricSir我這樣做了,但由於某些原因我無法使用ifstreams從文件中讀取數據。或者我做錯了什麼?當涉及到.png時,同樣的方法(通過cmake)取得了成功,但.txt文件沒有被讀取。 – fminkin

+0

C++的'ifstream'不知道如何從Qt的內部格式中讀取,但是相應的Qt文件管理類肯定是這樣的,例如'QFile','QTextStream'等。 – MrEricSir

回答

2

正如@MrEricSir指出的那樣,最好使用Qt resource system以及本地Qt類來通過流讀取文件。

但是,如果你還需要存儲在獨立的文件數據,您可以簡單地使用QCoreApplication::applicationDirPath()方法,它的路徑返回到可執行文件,並將其包裝成自己的功能,以尊重不同平臺上的應用程序結構。

例如:

QString getResourcesPath() 
{ 
#if defined(Q_OS_WIN) 
    return QApplication::applicationDirPath() + "/"; 
#elif defined(Q_OS_OSX) 
    return QApplication::applicationDirPath() + "/../Resources/"; 
#elif defined(Q_OS_LINUX) 
    return QApplication::applicationDirPath() + "/../share/yourapplication/"; 
#else 
    return QApplication::applicationDirPath() + "/"; 
#endif 
} 

此示例代碼假定:

  • 的Windows你存儲資源,在同一目錄下的可執行文件。
  • macOS您正在將資源存儲在.app包的Resources目錄中。根據Apple developer docs,可執行文件存儲在yourapplication.app/Contents/MacOS目錄中,資源文件通常存儲在yourapplication.app/Contents/Resources中。代碼只是相對於您的可執行文件前往Resources目錄。
  • On Linux您正在使用標準的Linux目錄結構,它使用單獨的binshare目錄。當然,您可以使用opt目錄或根本不捆綁您的應用程序 - 在這種情況下,您將不需要Linux的任何條件包含。有關更多信息,請閱讀Linux Filesystem Hierarchy Standard
+0

這很有效,謝謝。但似乎你不能用#elif來完成它,它只能爲每個返回使用單獨的#ifndef,就像它聲明的[這裏](https://wiki.qt.io/Get_OS_name) – fminkin

+0

@fminkin編輯代碼,謝謝指出。 '#elif defined'指令應該可以工作。 – kefir500

相關問題