一、HostInfo 简介
QHostInfo 是 Qt 网络模块中的一个类,用于进行主机名和 IP 地址之间的解析(DNS 解析)。它可以将主机名解析为 IP 地址,也可以将 IP 地址反解析为主机名。
头文件:
#include <QHostInfo>
所属模块:
QT += network
作用:
- 正向解析(Forward Lookup):主机名 → IP 地址;
- 反向解析(Reverse Lookup):IP 地址 → 主机名。
二、常用成员函数
三、用法示例
3.1 异步正向解析主机名(如 www.example.com)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QPlainTextEdit>
#include <QHostInfo>
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QWidget(parent) {
this->setFixedSize(800, 600);
this->setWindowTitle("查询域名或IP地址---测试程序");
m_pLineEdit = new QLineEdit(this);
m_pLineEdit->setText("www.126.com");
m_pBtn1 = new QPushButton("查询域名或IP地址", this);
connect(m_pBtn1, &QPushButton::clicked, this, &MainWindow::OnBtnGetDomainIPClicked);
m_pBtn2 = new QPushButton("清除数据信息", this);
connect(m_pBtn2, &QPushButton::clicked, this, &MainWindow::OnBtnClearDataClicked);
m_pTextEdit = new QPlainTextEdit(this);
QHBoxLayout *pHBoxLayout = new QHBoxLayout();
pHBoxLayout->addWidget(m_pLineEdit);
pHBoxLayout->addWidget(m_pBtn1);
pHBoxLayout->addWidget(m_pBtn2);
QVBoxLayout *pVBoxLayout = new QVBoxLayout(this);
pVBoxLayout->addLayout(pHBoxLayout);
pVBoxLayout->addWidget(m_pTextEdit);
}
QString ProtocolTypeName(QAbstractSocket::NetworkLayerProtocol protocoltype) {
switch (protocoltype) {
case QAbstractSocket::IPv4Protocol: return "IPv4 Protocol";
case QAbstractSocket::IPv6Protocol: return "IPv6 Protocol";
case QAbstractSocket::AnyIPProtocol: return "Any IP Protocol";
case QAbstractSocket::UnknownNetworkLayerProtocol: return "Unknown Network Layer Protocol";
}
}
private slots:
void OnBtnGetDomainIPClicked() {
// 主机名称
QString strHostName = m_pLineEdit->text();
m_pTextEdit->appendPlainText("所查询的主机信息:" + strHostName);
QHostInfo::lookupHost(strHostName, this, SLOT(LookupHostInfoFunc(QHostInfo)));
}
void OnBtnClearDataClicked() {
m_pLineEdit->clear();
m_pTextEdit->clear();
}
void LookupHostInfoFunc(const QHostInfo &host) {
QList<QHostAddress> addressList = host.addresses();
for (int i = 0; i < addressList.count(); i++) {
QHostAddress host = addressList.at(i);
m_pTextEdit->appendPlainText("协议类型:" + ProtocolTypeName(host.protocol()));
m_pTextEdit->appendPlainText("本机IP地址:" + host.toString());
m_pTextEdit->appendPlainText(" ");
}
}
private:
QLineEdit *m_pLineEdit;
QPushButton *m_pBtn1;
QPushButton *m_pBtn2;
QPlainTextEdit *m_pTextEdit;
};
#endif // MAINWINDOW_H
输出结果:
3.2 获取本地主机名和本地 IP 地址
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QGridLayout>
#include <QHostInfo>
#include <QNetworkInterface>
#include <QMessageBox>
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr): QWidget(parent)
{
this->setFixedSize(500, 200);
this->setWindowTitle("获取主机信息");
m_pHostLabel = new QLabel("主机名称:", this);
m_pHostEdit = new QLineEdit(this);
m_pBtnHost = new QPushButton("获取主机名称和IP地址", this);
connect(m_pBtnHost, &QPushButton::clicked, this, &MainWindow::OnBtnGetHostNameIPClicked);
m_pIPLabel = new QLabel("主机IP地址:", this);
m_pIPEdit = new QLineEdit(this);
m_pBtnIP = new QPushButton("获取主机所有信息", this);
connect(m_pBtnIP, &QPushButton::clicked, this, &MainWindow::OnBtnGetHostInfoClicked);
QGridLayout *pGridLayout = new QGridLayout(this);
pGridLayout->addWidget(m_pHostLabel, 0, 0, 1, 1);
pGridLayout->addWidget(m_pHostEdit, 0, 1, 1, 1);
pGridLayout->addWidget(m_pBtnHost, 0, 2, 1, 1);
pGridLayout->addWidget(m_pIPLabel, 1, 0, 1, 1);
pGridLayout->addWidget(m_pIPEdit, 1, 1, 1, 1);
pGridLayout->addWidget(m_pBtnIP, 1, 2, 1, 1);
this->setLayout(pGridLayout);
}
void GetHOstNameAndIpAddress()
{
// 获取主机名称
QString strLocalHostName = QHostInfo::localHostName();
m_pHostEdit->setText(strLocalHostName);
// 根据主机名称获取对应的IP地址
QString strLocalIP = "";
QHostInfo hostInfo = QHostInfo::fromName(strLocalHostName);
QList<QHostAddress> addressList = hostInfo.addresses();
if (!addressList.isEmpty()) {
for (int i = 0; i < addressList.size(); i++) {
QHostAddress addressHost = addressList.at(i);
if (QAbstractSocket::IPv4Protocol == addressHost.protocol()) {
strLocalIP = addressHost.toString();
break;
}
}
}
m_pIPEdit->setText(strLocalIP);
}
private slots:
void OnBtnGetHostNameIPClicked()
{
GetHOstNameAndIpAddress();
}
void OnBtnGetHostInfoClicked()
{
QString strTemp = "";
QList<QNetworkInterface> netList = QNetworkInterface::allInterfaces();
// 返回主机找到的所有网络接口的列表
for (int i = 0; i < netList.size(); i++) {
QNetworkInterface interfaces = netList.at(i);
strTemp = strTemp + "设备名称:" + interfaces.name() + "\n"; // 获取设备名称
strTemp = strTemp + "硬件地址:" + interfaces.hardwareAddress() +"\n"; // 获取硬件地址
QList<QNetworkAddressEntry> entryList = interfaces.addressEntries(); // 遍历每一个IP地址对应信息
for (int j = 0; j < entryList.size(); j++) {
QNetworkAddressEntry entry = entryList.at(j);
strTemp = strTemp + "IP地址:" + entry.ip().toString() + "\n";
strTemp = strTemp + "子网掩码:" + entry.netmask().toString() + "\n";
strTemp = strTemp + "广播地址:" + entry.broadcast().toString() + "\n";
}
}
QMessageBox::information(this, "主机所有信息", strTemp);
}
private:
QLabel *m_pHostLabel;
QLineEdit *m_pHostEdit;
QPushButton *m_pBtnHost;
QLabel *m_pIPLabel;
QLineEdit *m_pIPEdit;
QPushButton *m_pBtnIP;
};
#endif // MAINWINDOW_H
输出结果: