You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:09:34