總第17篇
在項目開發過程中,我們經常要擷取系統的相關資訊,進而了解系統和程式程序的運作情況,特别是在程式調試過程中,這些系統資訊對我們定位
bug
更加重要。本文将全面歸納總結擷取系統資訊的一些接口方法,并用代碼實作之,以便同行的你在開發過程中參考。如果覺得文章不錯,請收藏并順手點個贊,作為一個開發者,業餘堅持寫總結性的文章,确屬不易。
1.擷取計算機作業系統相關資訊
在使用Qt架構進行項目開發時,擷取系統資訊相對比較簡單,架構已經為我們提供了
QSysInfo
類,此類為我們提供了目前系統的一些底層接口資訊,其中包括:
代表目前系統是大端模式還是小端模式;
ByteOrder :
代表編譯應用程式的目前系統的指針大小,值為
WordSize :
;
(sizeof(void*)<<3)
代表目前運作應用程式的windows系統版本;
WindowsVersion :
代表目前運作應用程式的Mac系統的版本;
MacintoshVersion :
因為Qt是跨平台的,是以此類在不同的平台會有不同的接口,是以在使用時可以用預定義符号:
Q_OS_WIN
和
Q_OS_OSX
來判斷,應用程式是在哪個系統下編譯。此類的方法全部是靜态成員函數,可以友善地調用。
QString QSysInfo::buildAbi()
接口傳回的是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();
}
本文所歸納的幾個例子,在項目開發過程中經常用到,可以收藏,以備查閱參考。
本文到此結束!
如果對你有幫助,請随手
點個贊或
點喜歡!随手點贊,手留餘香!
=======================================================
歡迎【
關注作者、私信作者】。我們一起交流一起進步。
=======================================================