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中寻找一个c或c++函数,我可以调用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年代