项目使用QVersionNumber实现版本号比较的一些例子。
QVersionNumber version(1, 2, 3);
qDebug() << version;
// 输出:1.2.3
QString versionStr = version.toString();
qDebug() << versionStr;
// 输出:"1.2.3"
QVersionNumber v(1, 2, 3);
qDebug() << v.majorVersion(); // 输出:1
qDebug() << v.minorVersion(); // 输出:2
qDebug() << v.microVersion(); // 输出:3
QString str1 = "x.x.x"; // 导入无效的字符串
qDebug() << QVersionNumber::fromString(str1).toString();
// 输出: ""
QString str2 = "1.2.3"; // 导入有效字符串
qDebug() << QVersionNumber::fromString(str2).toString();
// 输出: "1.2.3"
QString str3("1.2.3-beta"); // 导入有效字符串
qDebug() << QVersionNumber::fromString(str3).toString();
// 输出: "1.2.3"
QString str4("1.2"); // 导入有效字符串
qDebug() << QVersionNumber::fromString(str4).toString();
// 输出: "1.2"
QString str5("1"); // 导入有效字符串
qDebug() << QVersionNumber::fromString(str5).toString();
// 输出: "1"
qDebug() << QVersionNumber(0, 0, 0).isNull();
// 输出:false
qDebug() << QVersionNumber().isNull();
// 输出:true
QVersionNumber v1(1, 0, 0);
QVersionNumber v2(1, 2, 3);
qDebug() << (v1 == v2);
// 输出: false
QVersionNumber v1(1, 2);
QVersionNumber v2(1, 2, 0);
qDebug() << (v1 == v2);
// 输出:false
QVersionNumber v1(1, 2);
QVersionNumber v2(1, 2, 0);
qDebug() << (v1.normalized() == v2.normalized());
// 输出:true
QVersionNumber v1(1, 2);
QVersionNumber v2(1, 2, 0);
QVersionNumber v = QVersionNumber::commonPrefix(v1, v2);
qDebug() << v;
// 输出:1.2
QVersionNumber v1(1, 2);
QVersionNumber v2(1, 2, 3);
bool value = v1.isPrefixOf(v2);
qDebug() << value;
// 输出:true
另外,最近在看QtCreator源码,找到了版本号比较的实现,只能比较"1.0","1.1",不支持比较"1.0.0"这样的版本号,分享给大家。
static bool compareVersions(const QString &version1, const QString &version2, bool allowHigherVersion)
{
if (version2.isEmpty())
return true;
if (version1 == version2)
return true;
if (!allowHigherVersion)
return false;
QStringList version1List = version1.split(QLatin1Char('.'));
QStringList version2List = version2.split(QLatin1Char('.'));
if (version1List.count() == 2 && version2List.count() == 2) {
bool ok;
int major1 = version1List.constFirst().toInt(&ok);
if (!ok)
return false;
int major2 = version2List.constFirst().toInt(&ok);
if (!ok)
return false;
if (major1 >= major2) {
int minor1 = version1List.constLast().toInt(&ok);
if (!ok)
return false;
int minor2 = version2List.constLast().toInt(&ok);
if (!ok)
return false;
if (minor1 >= minor2)
return true;
}
}
return false;
}