在 Qt 中获取系统版本信息,可以根据不同的操作系统(Windows、Linux、macOS 等)使用对应的 API,Qt 也提供了一些跨平台的基础信息接口。以下是常用的方法:
1. 跨平台基础信息(Qt 自带)
Qt 的QSysInfo类提供了跨平台的系统基础信息,包括系统名称、版本号等(部分信息可能不够详细)。
#include <QSysInfo>
#include <QDebug>
void getSystemInfo() {
// 系统名称(如"windows"、"linux"、"osx")
QString sysName = QSysInfo::productType();
// 系统版本(不同系统返回格式不同,可能是版本号或代号)
QString sysVersion = QSysInfo::productVersion();
// 内核版本
QString kernelVersion = QSysInfo::kernelVersion();
qDebug() << "系统名称:" << sysName;
qDebug() << "系统版本:" << sysVersion;
qDebug() << "内核版本:" << kernelVersion;
}
注意:productVersion()返回的信息可能较简略(例如 Windows 可能返回 "10",Linux 可能返回发行版代号),如需更详细的信息,需结合平台特定 API。
2. 针对 Windows 系统的详细版本
Windows 系统可以通过VersionHelpers.h(微软提供的头文件)或GetVersionEx等 API 获取详细版本(如 Windows 10、Windows 11 的具体版本号)。
#include <windows.h>
#include <VersionHelpers.h>
#include <QDebug>
void getWindowsVersion() {
// 判断是否为Windows 11
if (IsWindows11OrGreater()) {
qDebug() << "Windows 11 或更高版本";
}
// 判断是否为Windows 10
else if (IsWindows10OrGreater()) {
qDebug() << "Windows 10 或更高版本";
}
// 判断是否为Windows 8.1
else if (IsWindows8Point1OrGreater()) {
qDebug() << "Windows 8.1";
}
// 其他版本判断(Windows 8、7等)
else if (IsWindows8OrGreater()) {
qDebug() << "Windows 8";
}
else if (IsWindows7OrGreater()) {
qDebug() << "Windows 7";
}
// 获取详细版本号(通过OSVERSIONINFOEX)
OSVERSIONINFOEX osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if (GetVersionEx((OSVERSIONINFO*)&osvi)) {
qDebug() << "主版本号:" << osvi.dwMajorVersion;
qDebug() << "次版本号:" << osvi.dwMinorVersion;
qDebug() << "构建号:" << osvi.dwBuildNumber;
}
}
注意:
需在项目文件(.pro)中添加LIBS += -ladvapi32(链接系统库)。
Windows 10 及以上的版本判断可能需要应用程序清单(manifest)声明兼容的系统版本,否则可能返回不准确的结果。
3. 针对 Linux 系统的详细版本
Linux 系统的版本信息通常存储在/etc/os-release文件中(大多数发行版通用),可以直接读取该文件获取发行版名称和版本。
#include <QFile>
#include <QTextStream>
#include <QDebug>
void getLinuxVersion() {
QFile file("/etc/os-release");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&file);
QString content = in.readAll();
file.close();
// 解析发行版名称(NAME字段)
QString name = content.section("NAME=", 1, 1).section('\n', 0, 0).remove('"');
// 解析版本号(VERSION_ID字段)
QString version = content.section("VERSION_ID=", 1, 1).section('\n', 0, 0).remove('"');
qDebug() << "Linux发行版:" << name;
qDebug() << "版本号:" << version;
} else {
qDebug() << "无法读取系统版本信息(/etc/os-release不存在)";
}
}
4. 针对 macOS 系统的详细版本
macOS 可以通过sysctlbyname函数获取系统版本(如 macOS 12、13 等)。
#include <sys/sysctl.h>
#include <QDebug>
void getMacOSVersion() {
char str[256];
size_t size = sizeof(str);
// 获取macOS版本(如"13.4.1")
if (sysctlbyname("kern.osrelease", str, &size, nullptr, 0) == 0) {
QString kernelRelease = QString::fromUtf8(str);
qDebug() << "macOS内核版本:" << kernelRelease;
}
// 获取macOS产品版本(如"13.4.1")
if (sysctlbyname("kern.osproductversion", str, &size, nullptr, 0) == 0) {
QString productVersion = QString::fromUtf8(str);
qDebug() << "macOS产品版本:" << productVersion;
}
}
建议:
跨平台基础信息用QSysInfo。
详细信息需针对不同系统:
Windows:用VersionHelpers.h或GetVersionEx。
Linux:读取/etc/os-release文件。
macOS:用sysctlbyname函数。
使用时可通过QSysInfo::productType()判断当前系统,再调用对应平台的方法。