我需要弄清楚我的程序在运行时运行的操作系统。
我正在使用Qt 4.6.2,MinGW和Eclipse与CDT。我的程序应在Windows或Linux上运行命令行QProcess。现在我需要一种开关来根据操作系统运行不同的代码。
THX
答案 0 :(得分:24)
在Qt中,为编译时选项定义了以下OS宏
//前Qt5 Qt / X11 = Q_WS_X11已定义 Qt / Windows = Q_WS_WIN已定义 Qt / Mac OS X = Q_WS_MACX已定义
//对于Qt5以上 Qt / X11 =定义了Q_OS_X11 Qt / Windows = Q_OS_WIN已定义 Qt / Mac OS X = Q_OS_MACX已定义
然后QSysInfo类在运行时为您提供操作系统版本和其他选项。
答案 1 :(得分:21)
实际上操作系统是由Q_OS _...宏定义的。只是说。 Q_WS _...是窗口系统。不完全一样。 (我只是在阅读问题的作者所写的内容......“操作系统”。)
这些声明可在qglobal.h文件中找到。
Use Q_OS_x with x being one of:
DARWIN - Darwin OS (synonym for Q_OS_MAC)
SYMBIAN - Symbian
MSDOS - MS-DOS and Windows
OS2 - OS/2
OS2EMX - XFree86 on OS/2 (not PM)
WIN32 - Win32 (Windows 2000/XP/Vista/7 and Windows Server 2003/2008)
WINCE - WinCE (Windows CE 5.0)
CYGWIN - Cygwin
SOLARIS - Sun Solaris
HPUX - HP-UX
ULTRIX - DEC Ultrix
LINUX - Linux
FREEBSD - FreeBSD
NETBSD - NetBSD
OPENBSD - OpenBSD
BSDI - BSD/OS
IRIX - SGI Irix
OSF - HP Tru64 UNIX
SCO - SCO OpenServer 5
UNIXWARE - UnixWare 7, Open UNIX 8
AIX - AIX
HURD - GNU Hurd
DGUX - DG/UX
RELIANT - Reliant UNIX
DYNIX - DYNIX/ptx
QNX - QNX
QNX6 - QNX RTP 6.1
LYNX - LynxOS
BSD4 - Any BSD 4.4 system
UNIX - Any UNIX BSD/SYSV system
窗口系统定义如下:
Use Q_WS_x where x is one of:
MACX - Mac OS X
MAC9 - Mac OS 9
QWS - Qt for Embedded Linux
WIN32 - Windows
X11 - X Window System
S60 - Symbian S60
PM - unsupported
WIN16 - unsupported
使用#ifdef的一个主要问题是确保如果你在“新”平台上编译(从未在该平台上编译该软件),那么你想要使用#elif defined(...)
并且至少#else
{1}} + #error
...
#ifdef W_OS_LINUX
std::cout << "Linux version";
#elif defined(W_OS_CYGWIN)
std::cout << "Cygwin version";
#else
#error "We don't support that version yet..."
#endif
答案 2 :(得分:10)
Qt提供QSysInfo,如果你真的需要在运行时获得此功能。用于附加崩溃报告,但有任何其他内容尝试在编译时执行此操作。
答案 3 :(得分:7)
由于未定义Qt5宏Q_WS_ *!
您应该使用Q_OS_ *宏来代替:
Q_OS_AIX
Q_OS_ANDROID
Q_OS_BSD4
Q_OS_BSDI
Q_OS_CYGWIN
Q_OS_DARWIN - Darwin-based OS such as OS X and iOS, including any open source version(s) of Darwin.
Q_OS_DGUX
Q_OS_DYNIX
Q_OS_FREEBSD
Q_OS_HPUX
Q_OS_HURD
Q_OS_IOS
Q_OS_IRIX
Q_OS_LINUX
Q_OS_LYNX
Q_OS_MAC - Darwin-based OS distributed by Apple, which currently includes OS X and iOS, but not the open source version.
Q_OS_NETBSD
Q_OS_OPENBSD
Q_OS_OSF
Q_OS_OSX
Q_OS_QNX
Q_OS_RELIANT
Q_OS_SCO
Q_OS_SOLARIS
Q_OS_ULTRIX
Q_OS_UNIX
Q_OS_UNIXWARE
Q_OS_WIN32 - 32-bit and 64-bit versions of Windows (not on Windows CE).
Q_OS_WIN64
Q_OS_WIN - all supported versions of Windows. That is, if Q_OS_WIN32, Q_OS_WIN64 or Q_OS_WINCE is defined.
Q_OS_WINCE
Q_OS_WINPHONE
Q_OS_WINRT
文档中的更多详细信息
答案 4 :(得分:6)
当您的应用程序在您的开发计算机上编译时,这些答案中的大多数都为编译时确定所需信息提供了解决方案。
以下是在运行时期间获取所需信息的方式,当您的应用用户在他们的计算机上运行时。
qDebug() << "currentCpuArchitecture():" << QSysInfo::currentCpuArchitecture();
qDebug() << "productType():" << QSysInfo::productType();
qDebug() << "productVersion():" << QSysInfo::productVersion();
qDebug() << "prettyProductName():" << QSysInfo::prettyProductName();
典型结果:
21:43:09.855 Debug: currentCpuArchitecture(): "x86_64"
21:43:09.855 Debug: productType(): "windows"
21:43:09.855 Debug: productVersion(): "10"
21:43:09.855 Debug: prettyProductName(): "Windows 10 (10.0)"
QSysInfo
的文档为here。
答案 5 :(得分:3)
使用#ifdef在编译时执行此操作。
在Windows下,定义了WIN32。
所以,做:
#ifdef WIN32
// Windows code here
#else
// UNIX code here
#endif
答案 6 :(得分:1)
这通常使用预编译器指令来控制构建中包含/排除的代码块。
#ifdef WIN32
// ...
#endif
这导致(可以说)更丑陋的代码,但是有针对性的二进制文件。
答案 7 :(得分:1)
for runtime QGuiApplication::platformName()
这更准确地区分,例如,&#34; eglfs&#34;或&#34; directfb&#34;
答案 8 :(得分:0)
从Qt 5.9开始,QSysInfo的一些方法已被折旧,例如QSysInfo::windowsVersion()
从Qt 5.9开始的此类功能的替代类是QOperatingSystemVersion
例如
bool onWindows = ( QOperatingSystemVersion::Windows == QOperatingSystemVersion::currentType() );