親測可用 如圖所示 記得先 qmake 再build
qmake 可以隨意地自動生成一個適當填充的 Windows 資源文件。本節主要講解如何用 qmake 處理一個 Windows 資源文件,並將其鏈接到一個可執行應用程序(EXE)或動態鏈接庫(DLL)。
詳細說明
一個鏈接的 Windows 資源文件包含許多元素,可以由其 EXE 或者 DLL 來訪問。然而,Qt 資源系統應當以獨立於平台的方式訪問鏈接資源。但在鏈接的 Windows 資源文件中,有一些標准元素只能由 Windows 自身訪問。例如,在 Windows 資源管理器中,文件屬性的“詳細信息”需要由資源元素填充。此外,EXE 的程序圖標也需要從這些元素中讀取。所以,對於一個由 Qt 創建的 Windows EXE 或 DLL 來說,要同時使用這兩項技術,比較好的實踐方法是:通過 Qt 資源系統鏈接獨立於平台的資源,並通過一個 Windows 資源文件添加 Windows 的特定資源。
通常情況下,一個資源定義腳本(.rc 文件)被編譯成一個 Windows 資源文件。在微軟的工具鏈內部,RC 工具生成一個 .res 文件,該文件可以被微軟鏈接器鏈接到一個 EXE 或 DLL;MinGW 工具鏈使用 windres 工具生成一個 .o 文件,該文件可以被 MinGW 鏈接器鏈接到一個 EXE 或 DLL。
生成 .rc 文件
通過設置系統變量 VERSION 或 RC_ICONS (至少一個),qmake 會自動生成 .rc 文件。
以 VERSION 為例,在 pro 中添加版本信息:
VERSION = 1.2.0.0
執行 qmake,這時,會在 build 目錄下生成一個名為 MyApp_resource.rc 的文件,生成的 .rc 文件會被自動編譯和鏈接。
執行 Build(構建),會生成對應的 MyApp_resource.res 文件(已編譯的資源腳本)。
可以看到,生成 .rc 文件的同時,會適當的填充元素,而這些元素由系統變量 QMAKE_TARGET_COMPANY、QMAKE_TARGET_DESCRIPTION、QMAKE_TARGET_COPYRIGHT、QMAKE_TARGET_PRODUCT、RC_CODEPAGE、RC_ICONS、RC_LANG、和 VERSION 所決定。
如果這些元素不滿足需要,qmake 還提供了兩個系統變量:RC_FILE 和 RES_FILE,他們直接指向一個外部創建的 .rc 或 .res 文件。通過設置其中的一個變量,指定的文件就可以被鏈接到 EXE 或 DLL。
注意:如果設置了 RC_FILE 或 RES_FILE,qmake 對 .rc 文件的生成就失效了。這種情況下,qmake 不會對指定的 .rc 文件或 .res 或 .o 文件作進一步更改,有關 .rc 文件生成的變量不會有任何效果。
系統變量
QMAKE_TARGET_COMPANY
指定項目目標的公司名稱
QMAKE_TARGET_DESCRIPTION
指定項目目標的描述信息
QMAKE_TARGET_COPYRIGHT
指定項目目標的版權信息
QMAKE_TARGET_PRODUCT
指定項目目標的產品名稱
RC_CODEPAGE
指定應該被包含進一個 .rc 文件中的代碼頁
RC_LANG
指定應該被包含進一個 .rc 文件中的語言
注意: QMAKE_TARGET_COMPANY、QMAKE_TARGET_DESCRIPTION、QMAKE_TARGET_COPYRIGHT、QMAKE_TARGET_PRODUCT、RC_CODEPAGE、RC_LANG 均僅適用於 Windows, 而且只有在 VERSION 或 RC_ICONS 變量被設置,並且 RC_FILE 和 RES_FILE 變量沒有被設置的情況下生效。
RC_ICONS
僅適用於 Windows,指定應該被包含進一個 .rc 文件中的圖標,只有在 RC_FILE 和 RES_FILE 沒有被設置的情況下生效。
VERSION
指定程序的版本號,需要將 TEMPLATE 指定為 app 或 lib。
在 Windows 中,如果沒有設置變量 RC_FILE 和 RES_FILE,將會自動生成一個 .rc 文件,生成的文件包含 FILEVERSION 和 PRODUCTVERSION,由主版本、次版本、補丁版本和構建號填充,每個數字必須在 0 - 65535 范圍內。
例如:
win32:VERSION = 1.2.3.4 # major.minor.patch.build else:VERSION = 1.2.3 # major.minor.patch
windres
windres 可用於操縱 Windows 資源,windres 並不總是建成二進制實用程序的一部分,因為它只用於 Windows 目標。
在 windres 文檔中,關於語言的描述如下:
–language val
Specify the default language to use when reading an rc file. val should be a hexadecimal language code. The low eight bits are the language, and the high eight bits are the sublanguage.
意思是:指定讀取 rc 文件時使用的默認語言。val 應該是一個十六進制的語言代碼,低 8 位是語言,高 8 位是子語言。
關於語言代碼的描述可以參考:Language Identifier Constants and Strings
也就是說,如果要將程序的語言設置為“中文(簡體)”,則只需要在 pro 中設置語言的“區域設置標識符”0x0004 即可:
RC_LANG = 0x0004
1
示例
如上所屬,我們可以很輕易地將信息添加至 EXE 或 DLL 中:
只需要在 pro 中添加變量和對應的值:
# 版本信息 VERSION = 4.0.2.666 # 圖標 RC_ICONS = Images/MyApp.ico # 公司名稱 QMAKE_TARGET_COMPANY = "Digia" # 產品名稱 QMAKE_TARGET_PRODUCT = "Qt Creator" # 文件說明 QMAKE_TARGET_DESCRIPTION = "Qt Creator based on Qt 5.7.0 (MSVC 2013, 32 bit)" # 版權信息 QMAKE_TARGET_COPYRIGHT = "Copyright 2008-2016 The Qt Company Ltd. All rights reserved."
# 中文(簡體)
RC_LANG = 0x0004
執行 qmake -> build,再次打開 .rc 文件,對應的元素信息已經被填充進去了。
建議:如果需要反復修改變量值,最好的方式:clear -> qmake -> build。切記不要忘記 qmake,因為只有執行了 qmake,才會重新生成 .rc 文件,將新修改的值重新寫入。