查询一个主机的MAC地址或者IP地址是网络应用中常用到的功能,Qt提供了QHostInfo和QNetworkInterface 类可以用于此类信息的查询
1.QHostInfo 类(显示和查找本地的信息)是的主要函数
类别 | 函数原型 | 作用 |
公共函数 | QList <QHostAdress> address() | 返回与hostName()主机关联的IP地址列表 |
QString hostName() | 返回通过IP查找的主机的名称 | |
静态函数 | QHostInfo fromName(QSring &name) | 返回指定主机名的IP地址 |
QHostInfo localHostName() | 返回本机的主机名 | |
int lookupHost(QString &name,QObject *receiver,char*member) | 以异步方式根据主机名查找主机的IP地址,并返回一个表示本次查找的ID,可用于abortHostLookup() |
int lookupHost(QString &name,QObject *receiver,char*member)
name可以是主机名,可以是域名或者是一个IP地址。receiver和member指定一个响应函数的接收者和槽函数名称。
2.QNetworkInterface 类(获得应用程序上所在主机的所有网络接口,包括子网掩码和广播地址等)的主要函数
类别 | 函数原型 | 作用 |
公共函数 | QList <QNetworkAddressEntry> addressEntries() | 返回该网络接口(包括子网掩码和广播地址)的IP列表 |
QString hardwareAddress() | 返回该接口的低级硬件地址,以太网里就是MAC地址 | |
QString humanReadableName() | 返回可以读懂的接口名称,如果名称不太确定,得到的就是name()函数的返回值 | |
bool isValid() | 如果接口信息有效就返回true | |
QString name() | 返回网络接口名称 | |
静态函数 | QList <QHostAddress> allAddress() | 返回主机上所有IP地址的列表 |
QList <QNetworkInterface> allInterfaces() | 返回主机上所有接口的网络列表 |
QNetworkInterface 中包含的网络信息接口有IP地址,子网掩码和广播地址
分别用:ip()、netmask() 、broadcast()函数返回
NetworkInformation.h
#ifndef NETWORKINFORMATION_H
#define NETWORKINFORMATION_H#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QMessageBox>
#include <QGridLayout>
#include <QHostInfo>
#include <QNetworkInterface>
class NetworkInformation : public QWidget
{Q_OBJECTpublic:NetworkInformation(QWidget *parent = nullptr);~NetworkInformation();void getHostInformation(); //获取主机信息public slots:void slotDetail();private:QLabel *lab_host;QLineEdit *lineEdit_hostName;QLabel *lab_IpAdress;QLineEdit *lineEdit_IpAdress;QPushButton *btn_detail;QGridLayout *mainLayout;};
#endif // NETWORKINFORMATION_H
NetworkInformation.cpp
#include "networkinformation.h"NetworkInformation::NetworkInformation(QWidget *parent): QWidget(parent)
{lab_host=new QLabel(QStringLiteral("主机名:"));lineEdit_hostName=new QLineEdit;lab_IpAdress=new QLabel(QStringLiteral("IP地址:"));lineEdit_IpAdress=new QLineEdit;btn_detail=new QPushButton(QStringLiteral("详细"));mainLayout=new QGridLayout;mainLayout->addWidget(lab_host,0,0);mainLayout->addWidget(lineEdit_hostName,0,1);mainLayout->addWidget(lab_IpAdress,1,0);mainLayout->addWidget(lineEdit_IpAdress,1,1);mainLayout->addWidget(btn_detail,2,0,1,2);mainLayout->addWidget(lab_host,0,0);setLayout(mainLayout);getHostInformation();connect(btn_detail,SIGNAL(clicked()),this,SLOT(slotDetail()));}NetworkInformation::~NetworkInformation()
{
}//获取主机信息
void NetworkInformation::getHostInformation()
{QString localHostName=QHostInfo::localHostName(); //获取主机名lineEdit_hostName->setText(localHostName);QHostInfo hostInfo=QHostInfo::fromName(localHostName);//本机的IP地址QList<QHostAddress> listAdress=hostInfo.addresses(); //IP地址列表if(!listAdress.isEmpty()){lineEdit_IpAdress->setText(listAdress.first().toString()); //如果主机的IP列表不为空,则使用其第一个IP地址}}//获得与网络接口相关的信息
void NetworkInformation::slotDetail()
{QString detail="";QList<QNetworkInterface> list=QNetworkInterface::allInterfaces(); //主机上所有的接口的网络列表for(int i=0;i<list.count();i++){QNetworkInterface interface=list.at(i);detail=detail+(QStringLiteral("设备:"))+interface.name()+'\n'; // 获取网络接口的名字detail=detail+(QStringLiteral("硬件地址:"))+interface.hardwareAddress()+'\n';//获取网络接口的硬件地址QList<QNetworkAddressEntry> entryList=interface.addressEntries(); //返回网络接口(包括子网掩码和广播地址)的Ip地址列表for(int j=0;j<list.count();j++){QNetworkAddressEntry entry=entryList.at(i);detail=detail+'\t'+(QStringLiteral("IP地址:"))+entry.ip().toString()+'\n';detail=detail+'\t'+(QStringLiteral("子网掩码:"))+entry.netmask().toString()+'\n';detail=detail+'\t'+(QStringLiteral("广播地址:"))+entry.broadcast().toString()+'\n';}QMessageBox::information(this,(QStringLiteral("Detail")),detail);}}
结果: