如何在运行时确定 Qt 运行的平台?

28

有没有一种(Qt)的方式可以在运行时确定Qt应用程序正在运行的平台?

4个回答

65

意图:虽然我不太想提出一个将近两年的问题,但我认为一个好的修改后的答案是有价值的,可以记录下来,以便其他人在这个问题上结束时可以以正确的方式解决它。

我不禁注意到大多数答案都建议使用Q_WS一组宏来确定操作系统,但这不是一个好的解决方案,因为Q_WS_*是指窗口系统而不是操作系统平台(例如,X11可以在Windows或Mac OS X上运行,那么怎么办?),因此,人们不应该跟随这些宏来确定应用程序所编译的平台。

相反,应该使用Q_OS_*一组宏,其精确目的是确定操作系统。

目前,Qt 4.8中包括以下设置:

Q_OS_AIX
Q_OS_BSD4
Q_OS_BSDI
Q_OS_CYGWIN
Q_OS_DARWIN
Q_OS_DGUX
Q_OS_DYNIX
Q_OS_FREEBSD
Q_OS_HPUX
Q_OS_HURD
Q_OS_IRIX
Q_OS_LINUX
Q_OS_LYNX
Q_OS_MAC
Q_OS_MSDOS
Q_OS_NETBSD
Q_OS_OS2
Q_OS_OPENBSD
Q_OS_OS2EMX
Q_OS_OSF
Q_OS_QNX
Q_OS_RELIANT
Q_OS_SCO
Q_OS_SOLARIS
Q_OS_SYMBIAN
Q_OS_ULTRIX
Q_OS_UNIX
Q_OS_UNIXWARE
Q_OS_WIN32
Q_OS_WINCE

参考资料:

NB: 如评论中Wiz所述,Qt 5已完全删除了Q_WS_*宏集合,因此现在您只能使用Q_OS_*。


8
您可以补充一下,Qt5已完全删除所有Q_WS_*宏。因此,Q_OS_*现在是唯一可行的选择。 - Wiz
1
不要忘记 #include <QtGlobal> - paulm
1
因此,我应该使用Q_OS_LINUX而不是Q_WS_X11,但是X11也可能存在于Apple和Windows上。那么在Linux上的Wayland呢?我的问题是,如何使用这些新的宏适当地替换Q_WS_X11,仅指定操作系统?(我使用Q_WS_X11调用XInitThreads,现在它是一个应用程序属性,我只想在X11系统上打开它。) - math

27
注意,Q_WS_*宏是在编译时定义的,但QSysInfo提供了一些运行时详细信息。 为了扩展gs的功能,以便在运行时获取特定的Windows版本,您可以这样做
#ifdef Q_WS_WIN
switch(QSysInfo::windowsVersion())
{
  case QSysInfo::WV_2000: return "Windows 2000";
  case QSysInfo::WV_XP: return "Windows XP";
  case QSysInfo::WV_VISTA: return "Windows Vista";
  default: return "Windows";
}
#endif

如果你正在使用 Qt 版本 5.9 或以上,请使用下面提到的库函数来获取正确的操作系统详细信息。更多信息可以在这里找到。还有一个QSysInfo类,它可以执行一些附加功能。

#ifdef Q_WS_WIN
#include <QOperatingSystemVersion>

switch(QOperatingSystemVersion::current())
{
  case QOperatingSystemVersion::Windows7: return "Windows 7";
  case QOperatingSystemVersion::Windows8: return "Windows 8";
  case QOperatingSystemVersion::Windows10: return "Windows 10";
  default: return "Windows";
}
#endif

1
自Qt 5起已被弃用。Shinnok的答案是正确的。 - SexyBeast

2

对于Qt5,我使用以下内容:

logging.info("##### System Information #####")
sysinfo = QtCore.QSysInfo()
logging.info("buildCpuArchitecture: " + sysinfo.buildCpuArchitecture())
logging.info("currentCpuArchitecture: " + sysinfo.currentCpuArchitecture())
logging.info("kernel type and version: " + sysinfo.kernelType() + " " + sysinfo.kernelVersion())
logging.info("product name and version: " + sysinfo.prettyProductName())
logging.info("#####")

文档:http://doc.qt.io/qt-5/qsysinfo.html

该文档介绍了Qt的QSysInfo类,它提供了有关系统信息的方法和属性。这些信息包括操作系统类型、版本、处理器架构和主机名等。使用QSysInfo可以轻松地获取这些信息并在应用程序中使用。

0

这里是我代码的一部分,用于在运行时检测Windows或Mac以及版本

        #include <QSysInfo>
        #include <QOperatingSystemVersion>
        auto OSType= OSInfo.type();
        auto OSInfo = QOperatingSystemVersion::current();


        if (OSType !=1) //not windows os
        {
            return 0;
        }

        if (OSInfo < QOperatingSystemVersion::Windows7) // less than win7
        {
            return 0;
        }

声明应该倒序排列。 - Ambrus Tóth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接