Получение версии OS X с использованием Qt, c, Stack Overflow

Среда сборки: 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 ++ функцию в OS X я могу назвать живой; это проблема времени выполнения. Это должно работать с 10.6 года. Я пишу в C ++ так что я могу использовать с решение так же удобно, как C ++.

У меня есть это:

#ifdef Q_OS_WIN
QApplication::setGraphicsSystem("raster");
#else
QApplication::setGraphicsSystem("native");
#endif

Вышесказанное работает, чтобы определить, для меня ли это Windows или OS X. Внутри else в приведенном выше фрагменте мне нужно сделать дополнительную проверку; Мне не нужна «родная» графическая система, кроме как в OS X 10.12где QT «растровая» система имеет проблемы. я предпочитать «растровая» система, потому что она намного быстрее, но более поздние машины тоже быстрее, и поэтому, если я могу только вызвать «родную» систему на современной машине, работающей на последних ОС, это должно сработать.

У меня есть пользователи — большое их количество — работающие под более ранними версиями OS X, следовательно, все, что здесь используется, должно быть достаточно общим, чтобы работать на всех версиях OS 10.6 и выше. Сам QT 4.7, похоже, ничего не знает о версиях ОС, о которых он явно не знает; с помощью QSysInfo::MacVersionон просто сообщает «Неизвестная версия ОС».

В идеале я представляю что-то следующего вида:

int v = majorOSRevision();
int r = minorOSRevision();
int s = stepOSRevision();

Есть ли такие прямые, простые вызовы в OS X API?

0

Решение

Вы можете выполнить команду как 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();
}
2

Другие решения

OS X / macOS всегда хранит информацию о своем продукте в одном окончательном файле plist, который находится по адресу /System/Library/CoreServices/SystemVersion.plist

Если мы просмотрим этот файл в Высокой Сьерре, то увидим следующее

<?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, используйте Qt’s 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();
1

По вопросам рекламы [email protected]