C++ 使用Qt、c、c+检索OSX版本+;

C++ 使用Qt、c、c+检索OSX版本+;,c++,c,macos,qt,osx-snow-leopard,C++,C,Macos,Qt,Osx Snow Leopard,构建环境:Qt4.7,OSX10.6 运行环境:OSX10.6通过OSX10.13、WindowsXP及更高版本 我在一个非常大的、高度图形化的QT应用程序中工作。我需要知道我在-10.6上运行的是什么版本的OSX/MacOS。。。10.10... 10.12等 我在OSX中寻找一个c或c++函数,我可以调用live;这是一个运行时问题。它需要从10.6开始工作。我用c++写作,因此我可以像c++一样方便地使用c解决方案 我有这个: #ifdef Q_OS_WIN QApplicatio

构建环境:
Qt4.7
OSX10.6

运行环境:
OSX10.6
通过
OSX10.13
WindowsXP
及更高版本

我在一个非常大的、高度图形化的QT应用程序中工作。我需要知道我在-10.6上运行的是什么版本的
OSX
/
MacOS
。。。10.10... 10.12等

我在OSX中寻找一个cc++函数,我可以调用live;这是一个运行时问题。它需要从10.6开始工作。我用c++写作,因此我可以像c++一样方便地使用c解决方案

我有这个:

#ifdef Q_OS_WIN
    QApplication::setGraphicsSystem("raster");
#else
    QApplication::setGraphicsSystem("native");
#endif
上面的工作,以确定它是windows还是OS X我的建设。在上面片段的
else
中,我需要做一些进一步的检查;我不需要“本机”图形系统,除非在
OSX10.12
中,QT“光栅”系统有问题。我更喜欢“光栅”系统,因为它速度快得多,但后来的机器也快得多,因此如果我只能在运行最新操作系统的现代机器上调用“本机”系统,那应该行得通

我有很多用户在OSX的早期版本下运行,因此这里使用的任何东西都必须足够通用,可以在OS10.6及以上的所有版本上运行。Qt4.7本身似乎对它不明确知道的操作系统版本一无所知;使用
QSysInfo::MacVersion
,它只报告“未知操作系统版本”

理想情况下,我设想以下形式:

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

OS X API中是否存在此类直接、简单的调用?

您可以执行类似的命令并读取其输出

示例代码,使用
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
\ifndef OSXVERSION\u H
#定义OSXVERSION_H
#包括
类OSXVersion:公共QProcess
{
Q_对象
int majr;
int minr;
整数步;
OSXVersion();
公众:
int majorOSRevision()常量{return majr;}
int minorOSRevision()常量{return minr;}
int stepOSRevision()常量{return step;}
静态OSXVersion*getVersion();
专用插槽:
void dataReady();
};
#endif//OSXVERSION\u 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();
    }
}
#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();
}
#包括“osxversion.h”
OSXVersion::OSXVersion():QProcess(0)
{
majr=0;
minr=0;
步长=0;
连接(这个,信号(readyRead()),这个,插槽(dataReady());
}
OSXVersion*OSXVersion::getVersion()
{
OSXVersion*v=新OSXVersion();
v->start(“软件版本-productName”);
v->waitForFinished();
返回v;
}
void OSXVersion::dataReady()
{
int*v[3]={&majr,&minr,&step};
QByteArray数据=readAll();
QList tokens=data.split(“:”);
tokens=tokens[tokens.size()-1].split('.');

对于(inti=0;i您可以执行类似的命令并读取其输出

示例代码,使用
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
\ifndef OSXVERSION\u H
#定义OSXVERSION_H
#包括
类OSXVersion:公共QProcess
{
Q_对象
int majr;
int minr;
整数步;
OSXVersion();
公众:
int majorOSRevision()常量{return majr;}
int minorOSRevision()常量{return minr;}
int stepOSRevision()常量{return step;}
静态OSXVersion*getVersion();
专用插槽:
void dataReady();
};
#endif//OSXVERSION\u 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();
    }
}
#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();
}
#包括“osxversion.h”
OSXVersion::OSXVersion():QProcess(0)
{
majr=0;
minr=0;
步长=0;
连接(这个,信号(readyRead()),这个,插槽(dataReady());
}
OSXVersion*OSXVersion::getVersion()
{
OSXVersion*v=新OSXVersion();
v->start(“软件版本-productName”);
v->waitForFinished();
返回v;
}
void OSXVersion::dataReady()
{
int*v[3]={&majr,&minr,&step};
QByteArray数据=readAll();
QList tokens=data.split(“:”);
tokens=tokens[tokens.size()-1].split('.');

对于(int i=0;iOS 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>
现在我们有了
QString
中的版本,我们可以获得主要、次要和构建组件

QString version = getSysVersion();
QStringList components = version.split(".");
int maj = components[0].toInt();
int min = components[1].toInt();
int build = components[2].toInt();

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>
现在我们有了
QString
中的版本,我们可以获得主要、次要和构建组件

QString version = getSysVersion();
QStringList components = version.split(".");
int maj = components[0].toInt();
int min = components[1].toInt();
int build = components[2].toInt();

“Pablo……嗯……我不知道你是在打搅还是只是糊涂。在任何情况下,答案都是肯定的。我一般都写在C++中。当然,我可以随时回到C,这两种方法都可以。你回答问题了吗?没有时间写一个正确的答案。搜索格式塔…格式塔已经被贬为10.8,所以我担心你。sing itDup of…如果你需要回到10.6,就必须使用新旧组合。我不认为有一种方法是不确定的,但可以回到OS 10.6。当然,不推荐并不意味着它肯定很快就会消失。格式塔仍然在10.13 SDK中。@Pablo…嗯。我不知道你是在跟踪还是仅仅是确认在任何情况下,答案都是肯定的。我通常在C++中写作。当然,我可以随时回到C。这两种方法都可以。你回答问题了吗?没有时间写正确的答案。搜索格式塔…格式塔已经被贬低为10.8,所以我担心使用iDUP……必须使用旧和新的组合。如果你需要回到10.6。我不认为有一种方法是不预先确定的,但可以回到操作系统10.6。当然,不推荐并不意味着它肯定会很快消失。格式塔仍然在10.13年代