在网络应用中,经常需要获得本机的主机名、IP地址和硬件地址等网络信息。运用QHostInfo、QNetworkInterface、QNetworkAddressEntry可获得本机的网络信息。
具体实现步骤如下:
- 工程文件
QT += network
- 头文件
#include <QWidget> #include <QString> #include <QLabel> #include <QGridLayout> #include <QMessageBox> #include <QLineEdit> #include <QPushButton> #include <QHostInfo> #include <QNetworkInterface> class NetworkInformation : public QWidget { Q_OBJECT public: NetworkInformation(QWidget *parent = 0); void getHostInformation(); ~NetworkInformation(); public slots: void slotDetail(); private: QLabel *hostLabel; QLineEdit *LineEditLocalhostName; QLabel *ipLabel; QLineEdit *LineEditAddress; QPushButton *detailBtn; QGridLayout *mainLayout; };
- 源文件
#include "networkinformation.h" NetworkInformation::NetworkInformation(QWidget *parent) : QWidget(parent) { hostLabel = new QLabel(tr("主机名:")); LineEditLocalhostName = new QLineEdit; ipLabel = new QLabel(tr("IP地址:")); LineEditAddress = new QLineEdit; detailBtn = new QPushButton(tr("详细")); mainLayout = new QGridLayout(this); mainLayout->addWidget(hostLabel,0,0); mainLayout->addWidget(LineEditLocalhostName,0,1); mainLayout->addWidget(ipLabel,1,0); mainLayout->addWidget(LineEditAddress,1,1); mainLayout->addWidget(detailBtn,2,0,1,2); getHostInformation(); connect(detailBtn,SIGNAL(clicked(bool)),this,SLOT(slotDetail())); } NetworkInformation::~NetworkInformation() { } void NetworkInformation::getHostInformation() { QString localHostName = QHostInfo::localHostName(); LineEditLocalhostName->setText(localHostName); QHostInfo hostInfo = QHostInfo::fromName(localHostName); QList<QHostAddress> listAddress =hostInfo.addresses(); if(!listAddress.isEmpty()) { LineEditAddress->setText(listAddress.first().toString()); } } 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 + tr("设备:")+interface.name()+"\n"; detail = detail + tr("硬件地址:")+interface.hardwareAddress()+"\n"; QList<QNetworkAddressEntry> entryList = interface.addressEntries(); for(int j=0;j<entryList.count();j++) { QNetworkAddressEntry entry = entryList.at(j); detail = detail +"\t" + tr("IP地址:")+entry.ip().toString()+"\n"; detail = detail +"\t" + tr("子网掩码:")+entry.netmask().toString()+"\n"; detail = detail +"\t" + tr("广播地址:")+entry.broadcast().toString()+"\n"; } } QMessageBox::information(this,tr("Detail"),detail); }
其中:
- QString localHostName = QHostInfo::localHostName():获得本机主机名。QHostInfo提供了一系列有关网络信息的静态函数,可以根据主机名获得分配的IP地址,也可以根据IP地址获得相应的主机名。
- QHostInfo hostInfo = QHostInfo::fromName(localHostName):根据主机名获得相关主机信息,包括IP地址等。QHostInfo::fromName()函数通过主机名查找IP地址信息。
- QList<QHostAddress> listAddress = hostInfo.addresses():获得主机的IP地址列表。
- if(!listAddress.isEmpty()){……}:获得的主机IP地址列表可能为空。在不为空的情况下使用第一个P地址。
- QList<QNetworkInterface> list=QNetworkInterface::allInterfaces(): QNetworkInterface 类提供了一个主机IP地址和网络接口的列表。
- interface.name():获得网络接口的名称。
- interface.hardwareAddress():获得网络接口的硬件地址。
- interface.addressEntries():每个网络接口包括0个或多个IP地址,每个IP地址有选择性地与一个子网掩码和(或)一个广播地址相关联。QNetworkAddressEntry类存储了被网络接口支持的一个IP地址,同时还包括与之相关的子网掩码和广播地址。
运行结果: