Qt 設(shè)置軟件版本信息的實(shí)現(xiàn)
在運(yùn)行程序期間設(shè)置版本信息
大部分的程序在運(yùn)行之后都會(huì)提供一個(gè)關(guān)于的按鈕,通過(guò)點(diǎn)擊該按鈕并彈出一個(gè)關(guān)于界面,則可以查看相關(guān)的程序信息。此關(guān)于界面為用戶(hù)自定義的一個(gè)界面?;蛘呖梢栽谥鹘缑娴挠蚁陆秋@示出當(dāng)前軟件的版本信息。兩種方式之間并不沖突。
可以參考VS


在 QT 中設(shè)置軟件版本信息的幾種方法
方法一:通過(guò) .pro 文件設(shè)置 (qmake 項(xiàng)目)
1. 在 .pro 文件中添加版本信息
# 設(shè)置應(yīng)用程序版本
VERSION = 1.2.3
# 或者使用更詳細(xì)的版本設(shè)置
VER_MAJ = 1
VER_MIN = 2
VER_PAT = 3
VERSION = $$join(VER_MAJ, ., VER_MIN, ., VER_PAT)
# Windows 資源文件設(shè)置 (可選)
win32 {
RC_ICONS = myapp.ico
VERSIONRC = version.rc
RC_FILE = $$VERSIONRC
}2. 創(chuàng)建 version.rc 文件 (Windows)
#include <windows.h>#引入 Windows 頭文件
VS_VERSION_INFO VERSIONINFO#資源編譯器我們要定義的是一個(gè)版本信息資源
FILEVERSION 1,1,1,0#設(shè)置文件版本號(hào)
PRODUCTVERSION 1,2,3,0#設(shè)置產(chǎn)品版本號(hào),代表整體產(chǎn)品的版本(可和文件版本不同)
FILEFLAGSMASK 0x3fL#掩碼(Mask)用于指定有效的標(biāo)志位(file flags)
#ifdef _DEBUG#設(shè)置文件標(biāo)志(FileFlags),表示程序構(gòu)建的狀態(tài)
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L#設(shè)置目標(biāo)操作系統(tǒng)
FILETYPE 0x1L#設(shè)置文件類(lèi)型,0x1L 表示 VFT_APP,應(yīng)用程序(EXE)
FILESUBTYPE 0x0L#子類(lèi)型,應(yīng)用程序通常為 0x0L(無(wú)子類(lèi)型)。
BEGIN#開(kāi)始版本資源的內(nèi)容定義#語(yǔ)言和字符集標(biāo)識(shí)符:0409:表示語(yǔ)言為英文(美國(guó) English - United States)04b0:表示 Unicode 編碼頁(yè)(1200)
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "HXQ"
VALUE "FileDescription", "HXQ Robot Vision 2025"
VALUE "FileVersion", "1.1.1.0"
VALUE "InternalName", "HXQ Robot Vision 2025"#內(nèi)部名稱(chēng),通常為項(xiàng)目名。
VALUE "LegalCopyright", "@HXQ Corporation.All rights reserved. "#版權(quán)信息。
VALUE "OriginalFilename", "HXQ Robot Vision 2025.exe"#原始文件名,即編譯時(shí)生成的文件名。
VALUE "ProductName", "HXQ Robot Vision 2025"# 產(chǎn)品名稱(chēng)。
VALUE "ProductVersion", "1.1.1.0"# 字符串形式的產(chǎn)品版本。
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END方法二:通過(guò) CMake 設(shè)置 (CMake 項(xiàng)目)
1. 在 CMakeLists.txt 中設(shè)置版本
# 設(shè)置項(xiàng)目版本
set(PROJECT_VERSION_MAJOR 1)
set(PROJECT_VERSION_MINOR 2)
set(PROJECT_VERSION_PATCH 3)
project(YourApp VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH})
# 配置版本頭文件
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/version.h.in"
"${CMAKE_CURRENT_BINARY_DIR}/version.h"
)
# Windows 資源文件
if(WIN32)
set(RC_FILE "${CMAKE_CURRENT_SOURCE_DIR}/version.rc")
configure_file("${RC_FILE}.in" "${RC_FILE}")
set(APP_ICON "${CMAKE_CURRENT_SOURCE_DIR}/myapp.ico")
list(APPEND SOURCES "${RC_FILE}")
endif()2. 創(chuàng)建 version.h.in 文件
#ifndef VERSION_H
#define VERSION_H
#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
#define PROJECT_VERSION_PATCH @PROJECT_VERSION_PATCH@
#define PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
#endif // VERSION_H方法三:運(yùn)行時(shí)設(shè)置和獲取版本信息
在代碼中獲取版本信息
#include <QApplication>
#include <QVersionNumber>
#include <QDebug>
void checkVersion()
{
// 獲取應(yīng)用程序版本
QString versionStr = QApplication::applicationVersion();
qDebug() << "Application version:" << versionStr;
// 使用 QVersionNumber 進(jìn)行版本比較
QVersionNumber currentVersion = QVersionNumber::fromString(versionStr);
QVersionNumber minRequiredVersion(1, 0, 0);
if(currentVersion < minRequiredVersion) {
qWarning() << "This version is too old!";
}
// 獲取其他元數(shù)據(jù)
qDebug() << "Application name:" << QApplication::applicationName();
qDebug() << "Organization:" << QApplication::organizationName();
}最佳實(shí)踐建議
單一真實(shí)來(lái)源:確保版本信息只有一個(gè)來(lái)源,避免多處定義導(dǎo)致不一致
自動(dòng)化版本更新:
使用構(gòu)建系統(tǒng)自動(dòng)遞增版本號(hào)
集成到 CI/CD 流程中
版本格式:
遵循語(yǔ)義化版本控制 (SemVer) 規(guī)范 (MAJOR.MINOR.PATCH)
例如:1.2.3 表示主版本1,次版本2,修訂版本3
顯示版本信息:
在"關(guān)于"對(duì)話框中顯示完整版本信息
在日志中輸出版本信息以便調(diào)試
Windows 特殊處理:
確保資源文件中的版本與應(yīng)用程序版本一致
版本資源會(huì)影響文件屬性中的版本信息
完整示例:在"關(guān)于"對(duì)話框中顯示版本
#include <QMessageBox>
#include <QApplication>
void showAboutDialog()
{
QString aboutText = QString(
"<h2>%1</h2>"
"<p>版本: %2</p>"
"<p>Copyright ? 2023 %3. 保留所有權(quán)利。</p>"
"<p>了解更多: <a )
.arg(QApplication::applicationDisplayName(),
QApplication::applicationVersion(),
QApplication::organizationName());
QMessageBox::about(nullptr, "關(guān)于", aboutText);
}對(duì)于大多數(shù) QT 項(xiàng)目,方法一或方法二結(jié)合方法三是最常用的方式。
到此這篇關(guān)于Qt 設(shè)置軟件版本信息的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Qt 設(shè)置軟件版本信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)旋轉(zhuǎn)鏈表的實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)旋轉(zhuǎn)鏈表的實(shí)現(xiàn)的相關(guān)資料,這里提供實(shí)例幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08
C語(yǔ)言入門(mén)篇--學(xué)習(xí)選擇,if,switch語(yǔ)句以及代碼塊
本篇文章是基礎(chǔ)篇,適合c語(yǔ)言剛?cè)腴T(mén)的朋友,本文主要帶大家學(xué)習(xí)一下C語(yǔ)言的選擇,if,switch語(yǔ)句及代碼塊,幫助大家快速入門(mén)c語(yǔ)言的世界,更好的理解c語(yǔ)言2021-08-08
C語(yǔ)言實(shí)現(xiàn)三子棋實(shí)例代碼
大家好,本篇文章主要講的是C語(yǔ)言實(shí)現(xiàn)三子棋實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01
C語(yǔ)言基本排序算法之插入排序與直接選擇排序?qū)崿F(xiàn)方法
這篇文章主要介紹了C語(yǔ)言基本排序算法之插入排序與直接選擇排序?qū)崿F(xiàn)方法,結(jié)合具體實(shí)例形式分析了插入排序與直接選擇排序的定義、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-09-09
C++實(shí)現(xiàn)一維向量旋轉(zhuǎn)算法
這篇文章主要介紹了C++實(shí)現(xiàn)一維向量旋轉(zhuǎn)算法,非常實(shí)用的經(jīng)典算法,需要的朋友可以參考下2014-08-08
C/C++計(jì)算程序執(zhí)行時(shí)間的幾種方法實(shí)現(xiàn)
本文主要介紹了C/C++計(jì)算程序執(zhí)行時(shí)間的幾種方法實(shí)現(xiàn),包括使用clock()函數(shù)、使用庫(kù)和使用time.h頭文件中的time()函數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02
C++實(shí)現(xiàn)十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)的數(shù)學(xué)算法
這篇文章和大家分享一下我個(gè)人對(duì)十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)的想法,目前暫時(shí)更新只整數(shù)十進(jìn)制的轉(zhuǎn)換,后續(xù)會(huì)更新帶有小數(shù)的進(jìn)制轉(zhuǎn)換,代碼使用c++實(shí)現(xiàn)2021-09-09

