【问题标题】:How to determine the platform Qt is running on at runtime?如何确定 Qt 在运行时运行的平台?
【发布时间】:2010-10-03 07:26:14
【问题描述】:

是否有 (Qt) 方法来确定 Qt 应用程序在运行时运行的平台?

【问题讨论】:

    标签: qt qt4 cross-platform


    【解决方案1】:

    意图:虽然我讨厌提出问题 差不多2岁了,我想 一个好的修正答案是有价值的 记录在案,以便其他人 最终解决这个问题可以做到 正确的方式。

    我不禁注意到,大多数答案都建议使用 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
    

    参考资料:

    注意:正如 Wiz 在 cmets 中提到的,Qt 5 完全删除了 Q_WS_* 宏集,因此现在您只能使用 Q_OS_* 宏。

    【讨论】:

    • 您还可以添加 Qt5 已完全删除所有 Q_WS_* 宏的事实。所以 Q_OS_* 现在是唯一的出路了。
    • 别忘了#include
    • 所以我可能应该使用 Q_OS_LINUX 而不是 Q_WS_X11,但 X11 也可能出现在 Apple 和 Windows 上。 Linux 上的 Wayland 怎么样?所以我的问题是,如何用只指定操作系统的新宏正确替换 Q_WS_X11 ? (我用Q_WS_X11调用XInitThreads,现在是应用属性,我想只在X11系统上开启。)
    【解决方案2】:

    请注意,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
    

    Mac 类似。

    如果您使用的是 Qt 5.9 或更高版本,请使用下面提到的库函数来检索正确的操作系统详细信息,更多关于这可以找到here。还有一个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
    

    【讨论】:

    • 自 Qt 5 起已弃用。Shinnok 的答案是正确的。
    【解决方案3】:

    这是我在运行时检测 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;
            }
    

    【讨论】:

      【解决方案4】:

      对于 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-21
        • 2018-06-23
        • 2017-08-16
        • 2021-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多