Qt开发:QHostInfo的使用

一、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

输出结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值