如何在Qt中使用C++获取系统配置(如CPU、显卡型号)
在Qt中用C++获取系统硬件参数
Qt自带的QSysInfo类仅能获取部分基础系统信息,要拿到CPU型号、显卡型号这类具体硬件参数,需要结合不同平台的系统API实现。以下是各硬件参数的获取方案:
获取CPU型号
Windows平台
调用Windows原生API读取CPU详细信息:
#include <windows.h> #include <vector> #include <string> std::string getCPUModel() { SYSTEM_INFO sysInfo; GetSystemInfo(&sysInfo); DWORD bufferSize = 0; GetLogicalProcessorInformationEx(RelationProcessorCore, nullptr, &bufferSize); std::vector<BYTE> buffer(bufferSize); GetLogicalProcessorInformationEx(RelationProcessorCore, reinterpret_cast<PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX>(buffer.data()), &bufferSize); PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX info = reinterpret_cast<PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX>(buffer.data()); return std::string(info->Processor.Anonymous.ProcessorName.String); }
Linux平台
读取/proc/cpuinfo文件提取CPU型号:
#include <fstream> #include <string> std::string getCPUModel() { std::ifstream cpuinfo("/proc/cpuinfo"); std::string line; while (std::getline(cpuinfo, line)) { if (line.substr(0, 10) == "model name") { size_t colonPos = line.find(':'); return line.substr(colonPos + 2); } } return "Unknown"; }
macOS平台
通过sysctlbyname读取内核参数获取CPU型号:
#include <sys/sysctl.h> #include <string> std::string getCPUModel() { char model[256]; size_t size = sizeof(model); sysctlbyname("machdep.cpu.brand_string", &model, &size, nullptr, 0); return std::string(model); }
获取显卡型号
跨平台方案(基于OpenGL)
借助Qt的QOpenGLContext获取显卡渲染器信息,需先初始化OpenGL上下文:
#include <QOpenGLContext> #include <QOffscreenSurface> #include <QString> QString getGPUModel() { QOffscreenSurface surface; surface.create(); QOpenGLContext context; if (context.create()) { context.makeCurrent(&surface); QString renderer = QString::fromUtf8(reinterpret_cast<const char*>(glGetString(GL_RENDERER))); context.doneCurrent(); return renderer; } return "Unknown"; }
注意:此方法依赖系统OpenGL环境,未支持OpenGL的系统无法返回正确结果。
Windows平台(WMI方案)
通过WMI查询显卡信息,需链接wbemuuid.lib:
#include <comdef.h> #include <Wbemidl.h> #include <string> std::string getGPUModel() { HRESULT hres; hres = CoInitializeEx(0, COINIT_MULTITHREADED); hres = CoInitializeSecurity(nullptr, -1, nullptr, nullptr, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_NONE, nullptr); IWbemLocator* pLoc = nullptr; hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID*>(&pLoc)); IWbemServices* pSvc = nullptr; hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), nullptr, nullptr, 0, 0, 0, 0, &pSvc); hres = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_NONE); IEnumWbemClassObject* pEnumerator = nullptr; hres = pSvc->ExecQuery(_bstr_t("WQL"), _bstr_t("SELECT Name FROM Win32_VideoController"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, nullptr, &pEnumerator); IWbemClassObject* pclsObj = nullptr; ULONG uReturn = 0; std::string gpuName = "Unknown"; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) break; VARIANT vtProp; hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); gpuName = _com_util::ConvertBSTRToString(vtProp.bstrVal); VariantClear(&vtProp); pclsObj->Release(); } pEnumerator->Release(); pSvc->Release(); pLoc->Release(); CoUninitialize(); return gpuName; }
Linux平台
读取系统设备文件或调用lspci命令解析显卡信息:
#include <fstream> #include <string> #include <cstdio> std::string getGPUModel() { FILE* pipe = popen("lspci | grep VGA", "r"); if (!pipe) return "Unknown"; char buffer[256]; std::string result; while (fgets(buffer, sizeof(buffer), pipe) != nullptr) { result += buffer; } pclose(pipe); size_t colonPos = result.find(':'); if (colonPos != std::string::npos) { return result.substr(colonPos + 2); } return "Unknown"; }
获取其他基础系统信息
Qt的QSysInfo类可直接获取以下信息:
- 系统架构:
QSysInfo::currentCpuArchitecture() - 总物理内存:
QSysInfo::totalPhysicalMemory()(单位:字节) - 系统类型:
QSysInfo::productType()(如"windows"、"linux"、"macos") - 系统版本:
QSysInfo::productVersion()
内容的提问来源于stack exchange,提问作者Arshia Ramezan Mahmoodi
相关产品推荐
相关产品推荐

