QT C++ 获取计算机软件、硬件信息cpu、内存、显卡、操作系统等信息

news/2024/5/18 22:03:24 标签: QT, C++, 计算机信息, 硬件, 软件

    在使用QT 和 C++编程过程中,我们来讲讲怎样获取计算机软件硬件信息,包括计算机名称、cpu、显卡、内存、操作系统、几个屏幕以及每个屏幕的分辨率、硬盘信息、IP、MAC地址、公网IP、以及是否能够联网等信息。

头文件包含

#include <QHostAddress>
#include <QNetworkInterface>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QSysInfo>
#include "QSettings"
#include "QDebug"
#include <QDesktopWidget>
#include <QFileInfoList>
#include <QDir>
#include <QLibrary>
#include <QTimer>
#include <QHostInfo>

 

1.获取计算机名称

 

const QString Info::localmachineName()
{
    QString machineName = QHostInfo::localHostName();
    return machineName;
}

2.本地IP地址

const QString Info::ip()
{
    QString ip="";

    QList<QNetworkInterface> interFaceList = QNetworkInterface::allInterfaces();
    for(int i=0; i< interFaceList.size(); i++)
    {
        QNetworkInterface interface = interFaceList.at(i);
        if(interface.flags().testFlag(QNetworkInterface::IsRunning))
        {
            QList<QNetworkAddressEntry> entryList = interface.addressEntries();
            foreach(QNetworkAddressEntry entry, entryList)
            {
                if(QAbstractSocket::IPv4Protocol == entry.ip().protocol() &&
                   entry.ip() != QHostAddress::LocalHost && entry.ip().toString().startsWith("192.168."))
                {
                    ip = entry.ip().toString();
                    break;
                }
            }
        }
    }

    return ip;
}

3.公网IP

const QString Info::publicIp()
{
    QString strIp;
    QString webCode = getHtml("http://whois.pconline.com.cn/");

    if(!webCode.isEmpty())
    {
        QString web = webCode.replace(" ", "");
        web = web.replace("\r", "");
        web = web.replace("\n", "");
        QStringList list = web.split("<br/>");
        QString tar = list[3];
        QStringList ip = tar.split("=");
        strIp = ip[1];
    }
    else
        strIp="无法获取公网ip";


    return strIp;
}

 

 

 

4.获取计算机MAC地址

const QString Info::mac()
{
    QString strMac;

    QList<QNetworkInterface> netList = QNetworkInterface::allInterfaces();
    foreach(QNetworkInterface item, netList)
    {
        if((QNetworkInterface::IsUp & item.flags()) && (QNetworkInterface::IsRunning & item.flags()))
        {
            if(strMac.isEmpty() || strMac < item.hardwareAddress())
            {
                strMac = item.hardwareAddress();
            }
        }
    }
    return strMac;
}

 

 

 

5.获取计算机CPU信息

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

    return m_cpuDescribe;
}

6.获取计算机显卡信息

const QString Info::dCard()
{
    QString dcard;
    QSettings *DCard = new QSettings("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\nvlddmkm\\Device0",QSettings::NativeFormat);
    QString type = DCard->value("Device Description").toString();
    delete DCard;

    QString dType = type;
    dType.trimmed();
    if(!dType.isEmpty())
        dcard = dType;

    DCard = new QSettings("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\igfx\\Device0",QSettings::NativeFormat);
    type = DCard->value("Device Description").toString();
    delete DCard;

    dType = type;
    dType.trimmed();
    if(!dType.isEmpty())
        dcard = dcard + "\n" +dType;

    DCard = new QSettings("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\amdkmdap\\Device0",QSettings::NativeFormat);
    type = DCard->value("Device Description").toString();
    delete DCard;

    dType = type;
    dType.trimmed();
    if(!dType.isEmpty())
        dcard = dcard + "\n" +dType;

    dcard.trimmed();
    return dcard;
}

 

7.获取计算机内存

#include <Windows.h>
const QString& Info::memory()
{
    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof (statex);
    GlobalMemoryStatusEx(&statex);
    m_totalMem = statex.ullTotalPhys  * 1.0/ GB;
    m_freeMem = statex.ullAvailPhys * 1.0 / GB;

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

    return m_memDescribe;
}

 

 

 

8.获取计算机操作系统

const QString& Info::osVersion()
{
    typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
    LPFN_ISWOW64PROCESS fnIsWow64Process;
    BOOL bIsWow64 = FALSE;
    fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
    if (NULL != fnIsWow64Process)
    {
        fnIsWow64Process(GetCurrentProcess(),&bIsWow64);
    }
    QString sysBit = "unknown";
    if(bIsWow64)
        sysBit = "64位";
    else
        sysBit = "32位";

    m_osDescirbe = QSysInfo::prettyProductName() + " " + sysBit;
    return m_osDescirbe;
}

 

 

 

9.获取计算机屏幕个数以及像素

const QString& Info::screen()
{
    m_screenDescribe = "";
    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);
        }
    }

    m_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 > m_maxScreenSize.width() && height > m_maxScreenSize.height())
            m_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 += "、 ";
    }

    return m_screenDescribe;
}

 

 

 

10.获取计算机硬盘信息

const QString& Info::disk()
{
    m_diskDescribe = "";
    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 > m_maxFreeDisk)
                m_maxFreeDisk = freeMem;
        }
    }

    return m_diskDescribe;
}

11.获取计算机安装的office版本

void Info::checkOffice(QString &describe)
{
    QSettings settings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\excel.exe", QSettings::NativeFormat);
    QString path = settings.value("Path").toString();
    if(!path.isEmpty())
    {
        QSettings versionSettings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\Excel.Application\\CurVer", QSettings::NativeFormat);
        QString version = versionSettings.value(".").toString();
        if(!version.isEmpty())
        {
            version = version.split(".").last();
            int versionNum = version.toInt();
            switch (versionNum)
            {
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                    m_officeDecsribe = "Office 95以前版本";
                    break;
                case 6:
                    m_officeDecsribe = "Office 95";
                    break;
                case 8:
                    m_officeDecsribe = "Office 97";
                    break;
                case 9:
                    m_officeDecsribe = "Office 2000";
                    break;
                case 10:
                    m_officeDecsribe = "Office XP";
                    break;
                case 11:
                    m_officeDecsribe = "Office 2003";
                    break;
                case 12:
                    m_officeDecsribe = "Office 2007";
                    break;
                case 13:
                case 14:
                    m_officeDecsribe = "Office 2010";
                    break;
                case 15:
                    m_officeDecsribe = "Office 2013";
                    break;
                case 16:
                case 17:
                case 18:
                case 19:
                    m_officeDecsribe = "Office 2013以后版本";
                    break;
            default:
                break;
            }

            if(versionNum >= 13)//office 2010
            {
                describe = "已安装Office 版本:" + m_officeDecsribe;
            }
            else
            {
                describe = "建议安装Microsoft Offce2010以上版本。";
            }
        }
        else
        {
            describe = "建议安装Microsoft Offce2010以上版本。";
        }
    }
    else
    {
        describe = "建议安装Microsoft Offce2010以上版本。";
    }
}

 

12.判断计算机是否可以联网

 

bool Info::ipLive()
{
    //能接通百度IP说明可以通外网
    QTcpSocket tcpClient;
    tcpClient.abort();
    tcpClient.connectToHost("202.108.22.5", 80);
    //100毫秒没有连接上则判断不在线
    return tcpClient.waitForConnected(100);
}

13.获取网页所有源码

//获取网页所有源代码
QString Info::getHtml(QString url)
{
    QNetworkAccessManager *manager = new QNetworkAccessManager();
    QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
    QByteArray responseData;
    QEventLoop eventLoop;
    QTimer *timer = new QTimer(this);
    timer->setSingleShot(true);

    connect(manager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
    connect(timer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));

    timer->start(300);
    eventLoop.exec();
    responseData = reply->readAll();

    delete timer;

    return QString(responseData);
}

 

搞定,我做了个demo想要看源码的可以去看看https://download.csdn.net/download/xiezhongyuan07/10402206

 

 


http://www.niftyadmin.cn/n/1339928.html

相关文章

详解 c++ 关键字 explicit

用了很久的C 了&#xff0c;今天突然被小伙伴问道&#xff0c;构造函数前的explicit 关键字什么作用&#xff0c;于是自己也只能支支吾吾的说出“为了显式调用……”很尴尬啊……典型的知道所以然不知道其所以然……好吧&#xff0c;搜搜资料好好地充充电……首先说定义&#x…

QT QPointer 解析

使用qt 很久&#xff0c;只知道QPointer&#xff0c;但是在项目中很少用到&#xff0c;说到底还是没有对于QPointer了解不够透彻&#xff0c;所以在使用过程中才没有去使用&#xff0c;好吧&#xff0c;就是那种&#xff0c;不懂就不用&#xff0c;反正其他的方式能够满足需求&…

ubuntu 18.04 文件夹打不开了

# 查询pid ps aux | grep nautilus # kill查到的 sudo kill 查到的pid # 重启 nautilus -q

QT QSplashScreen 设置启动界面

当启动程序时&#xff0c;有时候在程序启动的时候需要做长时间的准备工作&#xff0c;这时候为了增加用户体验&#xff0c;我们需要在启动过程中显示一幅图片&#xff0c;动画和一些提示性文字来告诉用户现在正在启动&#xff0c;以及启动到什么阶段了。增加了程序的友好度。 Q…

创建软连接

https://chinese.freecodecamp.org/news/linux-symbolic-link/

QT 对QString简单地加密、解密

通过异或操作&#xff0c;对于字符串进行简单地加密&#xff0c;然后可以使用同一个函数进行解密&#xff0c;算法简单&#xff0c;是用于简单地加密解密&#xff0c;不适合严格的项目。 void Test::xorData(QByteArray &data) {static QByteArray key1 "myprivateke…

回溯notebook

文章目录回溯模板17. 电话号码的字母组合131. 分割回文串93. 复原 IP 地址78. 子集90. 子集 II491. 递增子序列小结46. 全排列小结47. 全排列 II小结332. 重新安排行程小结51. N 皇后回溯模板 for循环可以理解是横向遍历&#xff0c;backtracking&#xff08;递归&#xff09;就…

二维码简介和容错率的问题

二维码容错等级 2013-01-31浏览次数&#xff1a;1,316 次错误校正 损坏&#xff0c;但仍然解码的二维码 水平使用的Reed-Solomon纠错算法。越高误差校正水平&#xff0c;较少的存储容量。下表列出了在每一个的四个层次的近似误差校正能力&#xff1a; 电平L&#xff08;低&…