使用 Qt、c、c++ 检索 OS X 版本
Retrieving OS X version using Qt, c, c++
构建环境: QT 4.7
, OS X 10.6
运行 环境: OS X 10.6
至 OS X 10.13
、Windows XP
及更高版本
我正在使用一个非常大、高度图形密集的 QT 应用程序。我需要找出 OS X
/ MacOS
的版本 运行 - 10.6... 10.10... 10.12 等等
我正在寻找 c 或 c++ 中的函数 OS X 我可以实时调用;这是一个运行时问题。它需要从 10.6 开始工作。我正在用 c++ 编写,所以我可以像 c++.[=23 一样方便地使用 c 解决方案=]
我有这个:
#ifdef Q_OS_WIN
QApplication::setGraphicsSystem("raster");
#else
QApplication::setGraphicsSystem("native");
#endif
以上内容用于确定我正在构建的是 windows 还是 OS X。在上面片段的 else
里面,我需要做一些进一步的检查;我不需要 "native" 图形系统,除了 OS X 10.12
,其中 QT "raster" 系统有问题。我 更喜欢 "raster" 系统,因为它快得多,但后来的机器也更快,所以如果我只能在现代机器上调用 "native" 系统运行 最近 OS 的,应该可以。
我有很多用户 - 运行 在 OS X 的早期版本下,因此这里使用的任何内容都必须足够通用以适用于 [=63] 的所有版本=] 10.6 及以上。 QT 4.7 本身似乎对它没有明确知道的 OS 版本一无所知;使用 QSysInfo::MacVersion
,它只报告 "Unknown OS version."
理想情况下,我想像以下形式:
int v = majorOSRevision();
int r = minorOSRevision();
int s = stepOSRevision();
OS X API 中有这样直接、简单的调用吗?
您可以执行类似 sw_vers
的命令并读取其输出。
示例代码,使用 QProcess
:
osxversion.h
#ifndef OSXVERSION_H
#define OSXVERSION_H
#include <QProcess>
class OSXVersion : public QProcess
{
Q_OBJECT
int majr;
int minr;
int step;
OSXVersion();
public:
int majorOSRevision() const { return majr; }
int minorOSRevision() const { return minr; }
int stepOSRevision() const { return step; }
static OSXVersion * getVersion();
private slots:
void dataReady();
};
#endif // OSXVERSION_H
osxversion.cpp
#include "osxversion.h"
OSXVersion::OSXVersion() : QProcess(0)
{
majr = 0;
minr = 0;
step = 0;
connect(this, SIGNAL(readyRead()), this, SLOT(dataReady()));
}
OSXVersion * OSXVersion::getVersion()
{
OSXVersion * v = new OSXVersion();
v->start("sw_vers -productName");
v->waitForFinished();
return v;
}
void OSXVersion::dataReady()
{
int * v[3] = {&majr, &minr, &step};
QByteArray data = readAll();
QList<QByteArray> tokens = data.split(':');
tokens = tokens[tokens.size() - 1].split('.');
for(int i=0; i<tokens.size(); i++)
{
*(v[i]) = QString(tokens[i]).toInt();
}
}
main.cpp
#include <QCoreApplication>
#include <QDebug>
#include "osxversion.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
OSXVersion * version = OSXVersion::getVersion();
qDebug() << "OSX Version: "
<< version->majorOSRevision()
<< "."
<< version->minorOSRevision()
<< "."
<< version->stepOSRevision();
delete version;
return a.exec();
}
OS X / macOS 一直将其产品信息存储在一个最终的 plist 文件中,该文件位于 /System/Library/CoreServices/SystemVersion.plist
如果我们在 High Sierra 上查看此文件,我们可以看到以下内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ProductBuildVersion</key>
<string>17C205</string>
<key>ProductCopyright</key>
<string>1983-2018 Apple Inc.</string>
<key>ProductName</key>
<string>Mac OS X</string>
<key>ProductUserVisibleVersion</key>
<string>10.13.2</string>
<key>ProductVersion</key>
<string>10.13.2</string>
</dict>
</plist>
因为它是一个plist,根据给定的key
使用Qt的QSettings
读取任何值
#include <QSettings>
QString getSysVersion()
{
QSettings settings("/System/Library/CoreServices/SystemVersion.plist", QSettings::NativeFormat);
return settings.value("ProductUserVisibleVersion").toString();
}
现在我们有了QString
中的版本,我们可以获取主要、次要和构建组件
QString version = getSysVersion();
QStringList components = version.split(".");
int maj = components[0].toInt();
int min = components[1].toInt();
int build = components[2].toInt();
构建环境: QT 4.7
, OS X 10.6
运行 环境: OS X 10.6
至 OS X 10.13
、Windows XP
及更高版本
我正在使用一个非常大、高度图形密集的 QT 应用程序。我需要找出 OS X
/ MacOS
的版本 运行 - 10.6... 10.10... 10.12 等等
我正在寻找 c 或 c++ 中的函数 OS X 我可以实时调用;这是一个运行时问题。它需要从 10.6 开始工作。我正在用 c++ 编写,所以我可以像 c++.[=23 一样方便地使用 c 解决方案=]
我有这个:
#ifdef Q_OS_WIN
QApplication::setGraphicsSystem("raster");
#else
QApplication::setGraphicsSystem("native");
#endif
以上内容用于确定我正在构建的是 windows 还是 OS X。在上面片段的 else
里面,我需要做一些进一步的检查;我不需要 "native" 图形系统,除了 OS X 10.12
,其中 QT "raster" 系统有问题。我 更喜欢 "raster" 系统,因为它快得多,但后来的机器也更快,所以如果我只能在现代机器上调用 "native" 系统运行 最近 OS 的,应该可以。
我有很多用户 - 运行 在 OS X 的早期版本下,因此这里使用的任何内容都必须足够通用以适用于 [=63] 的所有版本=] 10.6 及以上。 QT 4.7 本身似乎对它没有明确知道的 OS 版本一无所知;使用 QSysInfo::MacVersion
,它只报告 "Unknown OS version."
理想情况下,我想像以下形式:
int v = majorOSRevision();
int r = minorOSRevision();
int s = stepOSRevision();
OS X API 中有这样直接、简单的调用吗?
您可以执行类似 sw_vers
的命令并读取其输出。
示例代码,使用 QProcess
:
osxversion.h
#ifndef OSXVERSION_H
#define OSXVERSION_H
#include <QProcess>
class OSXVersion : public QProcess
{
Q_OBJECT
int majr;
int minr;
int step;
OSXVersion();
public:
int majorOSRevision() const { return majr; }
int minorOSRevision() const { return minr; }
int stepOSRevision() const { return step; }
static OSXVersion * getVersion();
private slots:
void dataReady();
};
#endif // OSXVERSION_H
osxversion.cpp
#include "osxversion.h"
OSXVersion::OSXVersion() : QProcess(0)
{
majr = 0;
minr = 0;
step = 0;
connect(this, SIGNAL(readyRead()), this, SLOT(dataReady()));
}
OSXVersion * OSXVersion::getVersion()
{
OSXVersion * v = new OSXVersion();
v->start("sw_vers -productName");
v->waitForFinished();
return v;
}
void OSXVersion::dataReady()
{
int * v[3] = {&majr, &minr, &step};
QByteArray data = readAll();
QList<QByteArray> tokens = data.split(':');
tokens = tokens[tokens.size() - 1].split('.');
for(int i=0; i<tokens.size(); i++)
{
*(v[i]) = QString(tokens[i]).toInt();
}
}
main.cpp
#include <QCoreApplication>
#include <QDebug>
#include "osxversion.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
OSXVersion * version = OSXVersion::getVersion();
qDebug() << "OSX Version: "
<< version->majorOSRevision()
<< "."
<< version->minorOSRevision()
<< "."
<< version->stepOSRevision();
delete version;
return a.exec();
}
OS X / macOS 一直将其产品信息存储在一个最终的 plist 文件中,该文件位于 /System/Library/CoreServices/SystemVersion.plist
如果我们在 High Sierra 上查看此文件,我们可以看到以下内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ProductBuildVersion</key>
<string>17C205</string>
<key>ProductCopyright</key>
<string>1983-2018 Apple Inc.</string>
<key>ProductName</key>
<string>Mac OS X</string>
<key>ProductUserVisibleVersion</key>
<string>10.13.2</string>
<key>ProductVersion</key>
<string>10.13.2</string>
</dict>
</plist>
因为它是一个plist,根据给定的key
使用Qt的QSettings
读取任何值
#include <QSettings>
QString getSysVersion()
{
QSettings settings("/System/Library/CoreServices/SystemVersion.plist", QSettings::NativeFormat);
return settings.value("ProductUserVisibleVersion").toString();
}
现在我们有了QString
中的版本,我们可以获取主要、次要和构建组件
QString version = getSysVersion();
QStringList components = version.split(".");
int maj = components[0].toInt();
int min = components[1].toInt();
int build = components[2].toInt();