? ? ? Qt資源系統(Qt resource system)是一種獨立于平臺的機制,用于在應用程序中傳輸資源文件。如果你的應用程序始終需要一組特定的文件(例如圖標、翻譯文件和圖片),并且你不想使用特定于系統的方式來打包和定位這些資源,則可以使用Qt資源系統。
? ? ? 最常見的情況是,資源文件嵌入到應用程序可執行文件中,或者嵌入到應用程序可執行文件加載的庫和插件中。或者,資源文件也可以存儲在外部資源文件中。
? ? ? 資源系統基于Qt的rcc資源編譯器(Resource Compiler)、構建系統和Qt運行時API之間的緊密合作。
? ? ? 注意:目前,Qt資源系統尚未利用任何系統特定的資源處理功能,例如Windows、macOS和iOS上的資源處理功能。這種情況可能會在未來的Qt版本中得到改變。?
? ? ? Qt Resource Compiler(rcc):
? ? ? (1).rcc命令行工具:用于在構建過程中將資源嵌入到Qt應用程序中,讀取資源文件并生成C++或Python源文件,或者生成.rcc文件。rcc.exe位于6.8.0\msvc2019_64\bin,其支持的輸入參數如下所示:
? ? ? (2).文件列表和相關元數據(metadata)以Qt資源集合文件(Qt Resource Collection File)的形式傳遞給rcc。
? ? ? (3).默認情況下,rcc會生成C++源代碼,然后將其編譯為可執行文件或庫的一部分。"-g python"選項會生成Python源代碼。"-binary"選項會生成一個二進制存檔,按照慣例,該存檔會保存在.rcc文件中,并可在運行時加載。
? ? ? (4).注意:雖然可以從命令行運行rcc,但通常最好將其留給構建系統。
? ? ? Qt Resource Collection File(.qrc):
? ? ? (1)..qrc文件是一個XML文檔,其中列舉了需要作為運行時資源包含的本地文件。它作為rcc的輸入。mainwindow.qrc文件內容示例如下:在vs2022中此文件可以直接使用Qt Resource Editor打開
? ? ? (2).XML中的每個<file>元素都標識應用程序源代碼樹中的一個文件。路徑是相對于包含.qrc文件的目錄解析的。
? ? ? (3).默認情況下,該路徑也用于在運行時標識文件的內容。
? ? ? (4).Qt Creator、Qt Design Studio、Qt Widgets Designer和Qt Visual Studio Tools允許你通過便捷的用戶界面創建、檢查和編輯.qrc文件。除了Qt Widgets Designer之外,它們還為使用Qt資源系統的項目提供了向導。
? ? ? 構建系統集成:
? ? ? (1).使用rcc處理資源文件通常在應用程序構建時完成。一些構建工具對此提供了專門的支持,包括CMake和qmake。
? ? ? (2).如果啟用了CMAKE_AUTORCC,你只需將.qrc文件作為源添加到可執行文件或庫中即可。引用的資源文件將嵌入到二進制文件中:set(CMAKE_AUTORCC ON)
? ? ? (3).AUTORCC的替代方案是使用Qt6Core的CMake函數qt_add_resources,該函數可以更好地控制資源的創建。例如,它允許你直接在項目文件中指定資源的內容,而無需先編寫.qrc文件:調用qt_add_resources后會由mainwindow.qrc生成qrc_mainwindow.cpp,內容示例如下:
? ? ? Runtime API:
? ? ? 處理迭代和讀取文件的Qt API內置了對Qt資源系統的支持。你可以將資源路徑(而不是本地文件路徑)傳遞給QFile和QDir,也可以傳遞給QIcon、QImage和QPixmap等構造函數,如下所示:":"前綴明確表示應從Qt資源系統加載"/images/cut.png"
cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this);
? ? ? 高級主題:
? ? ? (1).前綴:.qrc文件可以設置一個前綴,該前綴將添加到<file>元素中指定的每個本地文件名之后,用于獲取資源系統中該文件的名稱。前綴允許你構建資源結構,避免通過不同庫或插件中的不同.qrc文件添加的資源文件之間發生沖突。
? ? ? (2).別名:有時,將資源文件在運行時置于其他路徑下會很方便。.qrc文件可以通過設置alias屬性來實現。
? ? ? (3).丟棄文件內容:有時你想將文件節點添加到資源文件系統,但實際上并不想添加文件內容。.qrc文件通過將empty屬性設置為true來實現此目的。生成的文件仍然可以從應用程序訪問,但其內容為空。這對于從應用程序二進制文件中剝離QML源代碼非常有用。
? ? ? (4).語言選擇器:某些資源需要根據用戶的語言環境進行更改,例如翻譯文件或圖標。資源集合文件通過為qresource標簽添加lang屬性來支持此功能,該屬性指定了合適的語言環境字符串。
? ? ? (5).嵌入大文件:默認情況下,rcc會將資源文件以C++數組的形式嵌入到可執行文件中。這對于大型資源尤其容易出現問題。如果編譯器運行時間過長,甚至由于內存溢出而失敗,你可以選擇一種特殊模式,在該模式下,資源將通過兩步過程嵌入。C++編譯器只會在目標可執行文件或庫中為資源預留足夠的空間。資源文件內容和元數據的實際嵌入是在編譯和鏈接階段之后,通過另一個rcc調用完成的。對于CMake,你需要使用qt_add_big_resources函數。
? ? ? (6).外部資源文件:除了將資源文件嵌入二進制文件之外,還可以將它們存儲在單獨的.rcc文件中。rcc允許使用"-binary"選項來實現此目的。此類.rcc文件必須在運行時使用QResource加載。對應CMake,可以使用qt_add_binary_resources函數。
? ? ? (7).壓縮:rcc會嘗試壓縮內容,以優化最終二進制文件中的磁盤空間使用率。如果需要,可以關閉壓縮功能。
? ? ? GitHub:https://github.com/fengbingchun/Qt_Test