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

在使用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);
}
 

想要看源码的可以去看看https://download.csdn.net/download/xiezhongyuan07/10402206

原文链接:https://blog.csdn.net/xiezhongyuan07/article/details/80249626

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值