Qt5获取计算机内存、CPU、操作系统、磁盘空间等信息

一、开发环境
Qt Creator,Qt5.12.10,win10系统
二、效果图
在这里插入图片描述
三、示例代码
.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QThread>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    // 获取电脑基本信息
    void getComputerInfo();

    //获取名称
    const QString getLocalHostName();
    //获取CPU信息
    const QString getCpuInfo();
    //获取显卡信息
    const QString getNvidiaDriverVersion();
    //获取内存
    const QString getMemory();
    //获取操作系统
    const QString getOsVersion();
    //获取磁盘空间
    const QString& getDisk();
    //获取屏幕个数以及像素
    const QString& getScreen();

private:
    Ui::MainWindow *ui;

    QString m_screenDescribe;
    QString m_diskDescribe;


};
#endif // MAINWINDOW_H

.cpp文件

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDesktopWidget>
#include <QApplication>
#include <QStorageInfo>
#include <QHostInfo>
#include <QSettings>
#include <QDebug>

#define _WIN32_DCOM
#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>
#include <string>
#include <QThread>
#include <QObject>
#pragma comment(lib, "wbemuuid.lib")

#define GB (1024*1024*1024)

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    getComputerInfo();

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::getComputerInfo()
{
    //获取计算机名称
    QString localHostNameStr = getLocalHostName();
    //处理器信息
    QString cpuDescribeStr = getCpuInfo();
    //获取显卡信息
    QString dCardStr = getNvidiaDriverVersion();
    //获取内存信息
    QString memoryStr = getMemory();
    //获取操作系统类型
    QString osVerStr = getOsVersion();
    //磁盘空间
    QString diskStr = getDisk();
    //获取计算机屏幕个数以及像素
    QString screenStr = getScreen();

    ui->label_computerInfo->setText("计算机名称: " + localHostNameStr + "\n"
                                    "处理器: " + cpuDescribeStr + "\n"
                                    "显卡: "+ dCardStr + "\n"
                                    "内存: "+ memoryStr + "\n"
                                    "系统类型: "+ osVerStr + "\n"
                                    "显示器: "+ screenStr + "\n"
                                    "磁盘空间: "+ diskStr);

}


const QString MainWindow::getLocalHostName()
{

    QString localHostName = QHostInfo::localHostName();

    return localHostName;
}

const QString MainWindow::getCpuInfo()
{
    QSettings *CPU = new QSettings("HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",QSettings::NativeFormat);
    QString cpuDescribe = CPU->value("ProcessorNameString").toString();
    delete CPU;

    return cpuDescribe;
}


const QString MainWindow::getNvidiaDriverVersion()
{
    QString driverVersion;
    HRESULT hres;

    // Initialize COM.
    hres = CoInitializeEx(0, COINIT_APARTMENTTHREADED);
    if (FAILED(hres))
    {
        qDebug() << "Failed to initialize COM library. " << "Error code = 0x" << hex << hres << endl;
        return "get failed";
    }

    // Initialize
    hres = CoInitializeSecurity(
                NULL,
                -1,                             // COM negotiates service
                NULL,                           // Authentication services
                NULL,                           // Reserved
                RPC_C_AUTHN_LEVEL_DEFAULT,      // authentication
                RPC_C_IMP_LEVEL_IMPERSONATE,    // Impersonation
                NULL,                           // Authentication info
                EOAC_NONE,                      // Additional capabilities
                NULL                            // Reserved
                );


    if (FAILED(hres))
    {
        qDebug() << "Failed to initialize security. " << "Error code = 0x" << hex << hres << endl;
        CoUninitialize();         // Program has failed.
        return "get failed";
    }

    // Obtain the initial locator to Windows Management
    // on a particular host computer.
    IWbemLocator *pLoc = 0;

    hres = CoCreateInstance(
                CLSID_WbemLocator,
                0,
                CLSCTX_INPROC_SERVER,
                IID_IWbemLocator, (LPVOID *)&pLoc);

    if (FAILED(hres))
    {
        qDebug() << "Failed to create IWbemLocator object. " << "Error code = 0x" << hex << hres << endl;
        CoUninitialize();
        return "get failed";
    }

    IWbemServices *pSvc = 0;

    // Connect to the root\cimv2 namespace with the
    // current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
                _bstr_t(L"ROOT\\CIMV2"), // WMI namespace
                NULL,                    // User name
                NULL,                    // User password
                0,                       // Locale
                NULL,                    // Security flags
                0,                       // Authority
                0,                       // Context object
                &pSvc                    // IWbemServices proxy
                );

    if (FAILED(hres))
    {
        qDebug() << "Could not connect. Error code = 0x" << hex << hres << endl;
        pLoc->Release();
        CoUninitialize();
        return "get failed";
    }

    qDebug() << "Connected to ROOT\\CIMV2 WMI namespace" << endl;

    // Set the IWbemServices proxy so that impersonation
    // of the user (client) occurs.
    hres = CoSetProxyBlanket(
                pSvc,                         // the proxy to set
                RPC_C_AUTHN_WINNT,            // authentication service
                RPC_C_AUTHZ_NONE,             // authorization service
                NULL,                         // Server principal name
                RPC_C_AUTHN_LEVEL_CALL,       // authentication level
                RPC_C_IMP_LEVEL_IMPERSONATE,  // impersonation level
                NULL,                         // client identity
                EOAC_NONE                     // proxy capabilities
                );

    if (FAILED(hres))
    {
        qDebug() << "Could not set proxy blanket. Error code = 0x" << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return "get failed";
    }


    // Use the IWbemServices pointer to make requests of WMI.
    // Make requests here:

    // For example, query for all the running processes
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
                bstr_t("WQL"),
                bstr_t("SELECT * FROM Win32_VideoController"),
                WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
                NULL,
                &pEnumerator);

    if (FAILED(hres))
    {
        qDebug() << "Query for processes failed. " << "Error code = 0x" << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return "get failed";
    }
    else
    {
        IWbemClassObject *pclsObj;
        ULONG uReturn = 0;

        while (pEnumerator)
        {
            hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
            if (0 == uReturn)
            {
                break;
            }

            VARIANT vtProp;
            VARIANT vtProp2;

            // Get the value of the Name property
            hres = pclsObj->Get(L"Description", 0, &vtProp, 0, 0);
            WCHAR* des;
            des = vtProp.bstrVal;

            driverVersion += QString::fromWCharArray(des) + "\n";

            hres = pclsObj->Get(L"Availability", 0, &vtProp2, 0, 0);

            VariantClear(&vtProp);
            VariantClear(&vtProp2);
        }

    }

    pSvc->Release();
    pLoc->Release();
    CoUninitialize();

    return driverVersion;
}

const QString MainWindow::getMemory()
{
    MEMORYSTATUSEX statex;

    statex.dwLength = sizeof (statex);
    GlobalMemoryStatusEx(&statex);
    double m_totalMem = statex.ullTotalPhys  * 1.0/ GB;
    double m_freeMem = statex.ullAvailPhys * 1.0 / GB;

    QString m_memDescribe = QString("可用 %1 GB / 共共 %2 GB" ).
            arg(QString::asprintf("%.2f", m_freeMem)).arg(QString::asprintf("%.2f", m_totalMem));

    return m_memDescribe;
}

const QString MainWindow::getOsVersion()
{
    typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
    PGNSI pGNSI;
    SYSTEM_INFO sysInfo;
    ZeroMemory(&sysInfo, sizeof(SYSTEM_INFO));
    pGNSI =(PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
    QString sysBit = "unknown";
    if (pGNSI)
    {
        pGNSI(&sysInfo);

        if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
            sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 ||
            sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM64)
        {
            sysBit = "64位";
        }else{
            sysBit = "32位";
        }
    }

    QString osDescirbe = QSysInfo::prettyProductName() + " " + sysBit;

    return osDescirbe;
}

const QString& MainWindow::getDisk()
{
    m_diskDescribe = "";
    double dMaxFreeDisk;
    QFileInfoList list = QDir::drives();
    foreach (QFileInfo dir, list)
    {
        QString dirName = dir.absolutePath();
        dirName.remove("/");
        LPCWSTR lpcwstrDriver = (LPCWSTR)dirName.utf16();
        ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;
        if(GetDiskFreeSpaceEx(lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes) )
        {
            QString free = QString::number((double) liTotalFreeBytes.QuadPart / GB, 'f', 1);
            free += "G";
            QString all = QString::number((double) liTotalBytes.QuadPart / GB, 'f', 1);
            all += "G";

            QString str = QString("%1可用%2/共%3  ").arg(dirName, free, all);
            m_diskDescribe += str;

            double freeMem = (double) liTotalFreeBytes.QuadPart / GB;

            if(freeMem > dMaxFreeDisk)
                dMaxFreeDisk = freeMem;
        }
    }

    return m_diskDescribe;
}

const QString& MainWindow::getScreen()
{
    QList<QSize> screenSizeList;
    QList <int> screenCountList;

    for(int i=0; i<QApplication::desktop()->screenCount(); i++)
    {
        QRect screenRect = QApplication::desktop()->screenGeometry(i);
        QSize size(screenRect.width(), screenRect.height());

        bool bExist = false;
        for(int j=0; j<screenSizeList.length(); j++)
        {
            QSize existSize = screenSizeList.at(j);
            if(size == existSize)
            {
                screenCountList[j]++;
                bExist = true;
                break;
            }
        }

        if(!bExist)
        {
            screenSizeList.append(size);
            screenCountList.append(1);
        }
    }

    QSize maxScreenSize = screenSizeList.at(0);
    for(int i=0; i<screenSizeList.length(); i++)
    {
        int width = screenSizeList.at(i).width();
        int height = screenSizeList.at(i).height();

        if(width > maxScreenSize.width() && height > maxScreenSize.height())
            maxScreenSize = screenSizeList.at(i);

        m_screenDescribe += QString ("(%1像素 x %2像素) x %3个").arg(width).arg(height).arg(screenCountList.at(i));
        if(i!= screenSizeList.length()-1)
            m_screenDescribe += "\n";
    }

    return m_screenDescribe;
}

四、源码下载地址
https://download.csdn.net/download/jiangCsion/19292958

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳跃的曲奇饼

你的鼓励是我创造更大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值