Qt QVersionNumber类详解-版本号比较实现

Qt QVersionNumber类详解-版本号比较实现 Qt QVersionNumber类详解-版本号比较实现一、QVersionNumber类详解1、概述2、核心功能与特性3、注意事项二、代码示例1、代码示例2、运行结果一、QVersionNumber类详解1、概述QVersionNumber类是 Qt 框架中用于表示和操作软件版本号的工具类。它专门设计用来处理由整数分段组成的版本号例如1.2.3,10.5,7等。相较于简单的字符串比较或手动解析整数QVersionNumber提供了更安全、更便捷的方式来比较、解析和格式化版本号。2、核心功能与特性表示版本号QVersionNumber内部使用一个QListint来存储版本号的各个分段。例如版本号1.2.3在内部表示为[1, 2, 3]。它可以表示任意数量的分段例如1,1.2,1.2.3.4。创建 QVersionNumber 对象构造函数:QVersionNumber(intmaj);// 单段版本号QVersionNumber(intmaj,intmin);// 两段版本号QVersionNumber(intmaj,intmin,intmic);// 三段版本号QVersionNumber(intmaj,intmin,intmic,intbuild);// 四段版本号 (Qt 6.2 引入)QVersionNumber(constQListintsegments);// 从整数列表构造支持任意分段数静态工厂方法:staticQVersionNumberfromString(QStringView versionString);// 从字符串解析访问版本分段int majorVersion() const: 返回主版本号第一段。int minorVersion() const: 返回次版本号第二段如果不存在则返回0。int microVersion() const: 返回微版本号第三段如果不存在则返回0。int buildVersion() const: 返回构建版本号第四段Qt 6.2如果不存在则返回0。const QListint segments() const: 返回所有版本分段的常量引用。这是最通用的访问方式。int segmentAt(int index) const: 返回指定索引处的分段值。如果索引无效小于 0 或大于等于segmentCount()返回0。int segmentCount() const: 返回版本号的分段数量。比较版本号QVersionNumber重载了所有常见的比较运算符 (,!,,,,)使得比较版本号变得非常直观QVersionNumberv1(1,2,3);QVersionNumberv2(1,2,4);if(v1v2){// v1 小于 v2}比较规则是逐段比较从第一段开始依次比较对应位置的分段值。如果所有对应分段都相等则较长的版本号被视为更大例如1.2.31.2。转换为字符串QString toString() const: 将版本号转换为标准格式的字符串分段之间用点号.连接例如1.2.3。QString toString(QChar separator) const: 允许指定自定义的分隔符例如toString(-)会生成1-2-3。QString toNormalizedString() const: 尝试生成一个更“规范”的字符串表示。它会移除末尾不必要的0分段例如[1, 2, 0]会变成1.2。注意这个方法可能不完全符合预期如[1, 2, 0, 4]会变成1.2.0.4使用时需留意其行为。检查是否正常bool isNull() const: 如果版本号对象不包含任何分段即segmentCount() 0则返回true。注意包含分段但所有分段值都为0例如0.0.0的版本号不是null。bool isNormalized() const: 检查toNormalizedString()是否会产生与toString()不同的结果即末尾是否有值为0的分段。例如[1, 2, 0]就不是规范化的。常见用法示例解析 Qt 自身的版本字符串:QString qtVersionStrqVersion();// 例如 6.4.1QVersionNumber qtVersionQVersionNumber::fromString(qtVersionStr);if(qtVersionQVersionNumber(6,4,0)){// 使用 Qt 6.4.0 或更高版本才有的功能}比较应用程序版本:QVersionNumbercurrentVersion(1,5,2);QVersionNumberminRequiredVersion(1,5,0);if(currentVersionminRequiredVersion){// 满足最低版本要求}处理不同分段数量的版本号:QVersionNumberv1(1,2);// 1.2QVersionNumberv2(1,2,0);// 1.2.0qDebug()(v1v2);// 输出 false, 因为 v2 有第三段 (0)qDebug()(v1.normalized()v2.normalized());// 可能输出 true (取决于实现v2.normalized() 可能变成 1.2)// 更可靠的方式是直接比较 segments()3、注意事项QVersionNumber设计用于处理纯数字分段。如果版本字符串包含非数字字符如字母、符号fromString()会尝试解析开头的数字部分并忽略后续内容例如1.2.3-beta会解析为[1, 2, 3]。如果需要完整处理这类复杂版本号可能需要结合正则表达式或其他解析方法。在比较不同分段数量的版本号时务必理解其比较规则逐段比较长度不同时较长的更大这有时可能与直觉不符如1.21.2.0。toNormalizedString()或手动处理分段列表可能有助于解决特定场景下的歧义。QVersionNumber为 Qt 应用程序中处理版本号提供了标准化和类型安全的解决方案推荐在需要比较或操作软件版本时使用它来代替原始的字符串操作。二、代码示例1、代码示例#includemainwindow.h#includeui_mainwindow.h#includeQCoreApplication#includeQVersionNumber#includeQDebug#includeQStringMainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){// 1. 创建 QVersionNumber 对象 // 方式1直接传入版本号分段主、次、修订、编译号QVersionNumberver1(6,5,2);// 6.5.2QVersionNumberver2(6,5);// 6.5QListintsegments{5,15,10,3};QVersionNumberver3(segments);// 方式2从字符串解析版本号自动处理 v1.2.3 / 1.2.3 格式QVersionNumber ver4QVersionNumber::fromString(6.6.0);QVersionNumber ver5QVersionNumber::fromString(v5.14.2);// 自动忽略前缀vQVersionNumber ver6QVersionNumber::fromString(unknown);// 解析失败空版本// 方式3空版本号QVersionNumber emptyVer;// 2. 版本号基本操作 qDebug() 版本号基本信息 ;// 转换为字符串输出qDebug()ver1 字符串ver1.toString();qDebug()ver3 字符串ver3.toString();// 获取主版本、次版本、修订号qDebug()ver1 主版本ver1.majorVersion();qDebug()ver1 次版本ver1.minorVersion();qDebug()ver1 修订号ver1.microVersion();// 判断是否为空版本解析失败/未初始化qDebug()emptyVer 是否为空emptyVer.isNull();qDebug()ver6 是否为空ver6.isNull();// 规范化版本去掉末尾的06.5.0 → 6.5QVersionNumberver7(6,5,0);qDebug()原版本6.5.0规范化后ver7.normalized().toString();// 3. 版本号比较核心功能 qDebug()\n 版本号比较 ;qDebug()ver1(6.5.2) ver2(6.5)(ver1ver2);qDebug()ver1(6.5.2) ver4(6.6.0)(ver1ver4);qDebug()ver1 QVersionNumber(6,5,2)(ver1QVersionNumber(6,5,2));// 静态方法比较两个版本intcompareResQVersionNumber::compare(ver1,ver4);if(compareRes0)qDebug()ver1 小于 ver4;elseif(compareRes0)qDebug()ver1 大于 ver4;elseqDebug()版本相等;// 4. 实际业务场景版本检查 qDebug()\n 实际场景最低版本要求 ;QVersionNumberminRequiredVer(6,5);// 程序要求最低 Qt 6.5QVersionNumber currentVerQVersionNumber::fromString(qVersion());// 获取当前Qt版本qDebug()当前Qt版本currentVer.toString();qDebug()最低要求版本minRequiredVer.toString();if(currentVerminRequiredVer){qDebug()版本满足要求可以运行;}else{qDebug()版本过低请升级到 Qt 6.5 及以上;}}MainWindow::~MainWindow(){deleteui;}2、运行结果14:13:07:Starting G:\Learning\Qt\untitled\build\Desktop_Qt_6_9_0_MinGW_64_bit-Debug\debug\untitled.exe...版本号基本信息ver1 字符串6.5.2ver3 字符串5.15.10.3ver1 主版本6ver1 次版本5ver1 修订号2emptyVer 是否为空 true ver6 是否为空 true 原版本6.5.0规范化后6.5版本号比较ver1(6.5.2)ver2(6.5) truever1(6.5.2)ver4(6.6.0) true ver1QVersionNumber(6,5,2) true ver1 小于 ver4实际场景最低版本要求当前Qt版本6.9.0最低要求版本6.5?版本满足要求可以运行14:13:22:The commandG:\Learning\Qt\untitled\build\Desktop_Qt_6_9_0_MinGW_64_bit-Debug\debug\untitled.exefinished successfully.