天天看點

js 擷取本機ip_一文全面掌握:Qt開發中擷取系統相關資訊的方法,值得收藏參考

js 擷取本機ip_一文全面掌握:Qt開發中擷取系統相關資訊的方法,值得收藏參考

總第17篇

在項目開發過程中,我們經常要擷取系統的相關資訊,進而了解系統和程式程序的運作情況,特别是在程式調試過程中,這些系統資訊對我們定位

bug

更加重要。本文将全面歸納總結擷取系統資訊的一些接口方法,并用代碼實作之,以便同行的你在開發過程中參考。如果覺得文章不錯,請收藏并順手點個贊,作為一個開發者,業餘堅持寫總結性的文章,确屬不易。

1.擷取計算機作業系統相關資訊

在使用Qt架構進行項目開發時,擷取系統資訊相對比較簡單,架構已經為我們提供了

QSysInfo

類,此類為我們提供了目前系統的一些底層接口資訊,其中包括:

ByteOrder :

代表目前系統是大端模式還是小端模式;

WordSize :

代表編譯應用程式的目前系統的指針大小,值為

(sizeof(void*)<<3)

;

WindowsVersion :

代表目前運作應用程式的windows系統版本;

MacintoshVersion :

代表目前運作應用程式的Mac系統的版本;

因為Qt是跨平台的,是以此類在不同的平台會有不同的接口,是以在使用時可以用預定義符号:

Q_OS_WIN

Q_OS_OSX

來判斷,應用程式是在哪個系統下編譯。此類的方法全部是靜态成員函數,可以友善地調用。

QString QSysInfo::buildAbi()

接口傳回的是Qt程式平台的架構全部資訊,包含三個或三個以上的部分,用

-

分隔,具體說明如下表:

js 擷取本機ip_一文全面掌握:Qt開發中擷取系統相關資訊的方法,值得收藏參考

QString QSysInfo::buildCpuArchitecture()

接口傳回編譯Qt程式的CPU架構。這個架構可能與Qt程式實際運作的CPU不同,因為可能存在仿真層或該CPU支援多個架構。接口通常的傳回值有:

arm

arm64

i386

ia64

mips

mips64

power

power64

sparc

sparcv9

x86_64

等。

QString QSysInfo::currentCpuArchitecture()

接口傳回的是Qt程式目前運作的CPU架構。

擷取系統資訊的示例代碼如下:

#include <QCoreApplication>
#include <QSysInfo>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "WindowsVersion: " << QSysInfo::WindowsVersion;
    qDebug() << "buildAbi: " << QSysInfo::buildAbi();
    qDebug() << "buildCpuArchitecture: " << QSysInfo::buildCpuArchitecture();
    qDebug() << "currentCpuArchitecture: " << QSysInfo::currentCpuArchitecture();
    qDebug() << "kernelType: " << QSysInfo::kernelType();     //核心類型
    qDebug() << "kernelVersion: " << QSysInfo::kernelVersion();    //核心版本
    qDebug() << "machineHostName: " << QSysInfo::machineHostName();   // 主機名稱
    qDebug() << "prettyProductName: " << QSysInfo::prettyProductName();   //作業系統的産品名稱
    qDebug() << "productType: " << QSysInfo::productType();
    qDebug() << "productVersion: " << QSysInfo::productVersion();  //産品版本

    return a.exec();
}
           

2. 擷取計算主機的相關資訊

在網絡通信過程中,我們需要獲得計算機的主機資訊。在QT中,可以用類

QHostInfo

的接口。此類提供網絡中計算主機的相關資訊,并且所有接口全部為靜态函數,調用非常友善。示例如下:

#include <QCoreApplication>
#include <QHostInfo>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug()<<QHostInfo::localHostName();
    qDebug()<<QHostInfo::localDomainName();

    return a.exec();
}
           

3. 擷取本機的IP位址

擷取本機的IP時,需要用到類

QNetworkInterface

QNetworkAddressEntry

兩個類。其代碼示例如下:

#include <QCoreApplication>
#include <QNetworkAddressEntry>
#include <QNetworkInterface>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    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;
                   }
               }
           }
       }

    qDebug()<<ip;

    return a.exec();
}
           

4. 擷取計算機的MAC位址

要想知道計算的MAC位址也比較容易,也要用到

QNetworkInterface

類。其代碼示例如下:

#include <QCoreApplication>
#include <QNetworkInterface>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    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();
                }
            }
        }
    qDebug()<<strMac;

    return a.exec();
}
           

5. 擷取計算CPU相關資訊

可以用

QSettings

類的相關接口來擷取相關的資訊。此類提供獨立于平台的應用程式設定資訊接口。 擷取CPU資訊,可以直接通路

系統資料庫

中相應的

鍵值

。其示例代碼如下:

#include <QCoreApplication>
#include <QSettings>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QSettings *CPU = new QSettings("HKEY_LOCAL_MACHINEHARDWAREDESCRIPTIONSystemCentralProcessor0",QSettings::NativeFormat);
    QString m_cpuDescribe = CPU->value("ProcessorNameString").toString();
    delete CPU;

    qDebug()<<m_cpuDescribe;

    return a.exec();
}
           

擷取計算機的顯示卡資訊也是類似的,我也将其方法歸納如下:

#include <QCoreApplication>
#include <QSettings>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString dcard;
    QSettings *DCard = new QSettings("HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesnvlddmkmDevice0",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_MACHINESYSTEMControlSet001ServicesigfxDevice0",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_MACHINESYSTEMControlSet001ServicesamdkmdapDevice0",QSettings::NativeFormat);
    type = DCard->value("Device Description").toString();
    delete DCard;

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

    dcard.trimmed();
    qDebug()<<dcard;

    return a.exec();
}
           

6. 擷取計算機記憶體資訊

擷取計算機記憶體資訊,要使用

window.h

中 結構體

MEMORYSTATUEX

。其示例代碼如下:

#include <QCoreApplication>
#include <windows.h>
#include <QDebug>

#define GB (1024*1024*1024)

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof (statex);
    GlobalMemoryStatusEx(&statex);

    qDebug()<<"實體記憶體總量:"<<statex.ullTotalPhys  *1.0/GB;
    qDebug()<<"可用的實體記憶體:"<<statex.ullAvailPhys *1.0/GB;
    qDebug()<<"虛拟記憶體總量:"<<statex.ullTotalVirtual *1.0/GB;

    return a.exec();
}
           

7. 擷取計算螢幕的個數及像素情況

擷取計算機螢幕要用到

QDesktopWidget

類, 這就要求QT項目中要包含

widgets

子產品。其示例代碼如下:

#include <QApplication>
#include <QDesktopWidget>
#include <QDebug>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QString 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);
        }
    }

    QSize 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 += "、 ";
    }

    qDebug()<<m_screenDescribe;


    return a.exec();
}
           

8. 擷取計算機硬碟資訊

擷取硬碟的資訊,首先我們要通過

QDir::drives()

來獲得磁盤的檔案資訊清單,這是個靜态函數,可以直接調用。其擷取硬碟資訊的示例代碼如下:

#include <QApplication>
#include <QFileInfoList>
#include <QDir>
#include <windows.h>
#include <QDebug>

#define GB (1024*1024*1024)

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QString m_diskDescribe = "";
    QFileInfoList list = QDir::drives();
    double m_maxFreeDisk = 0.0;
    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;
        }
    }
    qDebug()<<m_diskDescribe;

    return a.exec();
}
           

9. 判斷計算機是否可以聯外網

我們可以看計算機是否可以連接配接外網的某一個IP,如百度等,其代碼示例如下:

#include <QApplication>
#include <QTcpSocket>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTcpSocket tcpClient;
    tcpClient.abort();
    tcpClient.connectToHost("202.108.22.5", 80);
    //300毫秒沒有連接配接上則判斷不線上
    qDebug()<<"haha:"<<tcpClient.waitForConnected(300);
    
    return a.exec();
}
           

10. 擷取系統安裝的office版本

擷取軟體的版本資訊,還是通過

QSettings

類找到

系統資料庫

中的

鍵值

。其它軟體的版本擷取方式類似。其示例代碼如下:

#include <QApplication>
#include <QSettings>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QString m_officeDecsribe;
    QString describe;
    QSettings settings("HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionApp Pathsexcel.exe", QSettings::NativeFormat);
    QString path = settings.value("Path").toString();
    if(!path.isEmpty())
    {
        QSettings versionSettings("HKEY_LOCAL_MACHINESOFTWAREClassesExcel.ApplicationCurVer", 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以上版本。";
    qDebug()<<"hehe:"<<describe;

    return a.exec();
}
           

本文所歸納的幾個例子,在項目開發過程中經常用到,可以收藏,以備查閱參考。

本文到此結束!

如果對你有幫助,請随手

點個贊

點喜歡

!随手點贊,手留餘香!

=======================================================

歡迎【

關注作者、私信作者】

。我們一起交流一起進步。

=======================================================