《QT6/C++开发指南》网络/主机信息查询/案例15-1

效果图

在这里插入图片描述

代码

.pro

在这里插入图片描述

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include    <QAbstractSocket>
#include    <QHostInfo>
#include    <QNetworkInterface>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

private:
    QString  protocolName(QAbstractSocket::NetworkLayerProtocol protocol);
    QString  interfaceType(QNetworkInterface::InterfaceType type);

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void do_lookedUpHostInfo(const QHostInfo &host);

    void on_btnGetHostInfo_clicked();

    void on_btnLookup_clicked();

    void on_btnAllAddress_clicked();

    void on_btnAllInterface_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include    <QHostInfo>
#include    <QNetworkInterface>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

QString MainWindow::protocolName(QAbstractSocket::NetworkLayerProtocol protocol)
{//通过协议类型返回协议名称
    switch(protocol)
    {
    case QAbstractSocket::IPv4Protocol:
        return "IPv4";
    case QAbstractSocket::IPv6Protocol:
        return "IPv6";
    case QAbstractSocket::AnyIPProtocol:
        return "Any Internet Protocol";
    default:
        return "Unknown Network Layer Protocol";
    }
}

void MainWindow::on_btnGetHostInfo_clicked()
{//"获取本机主机名和IP地址" 按钮
    ui->textEdit->clear();
    QString hostName=QHostInfo::localHostName();    //本地主机名
    ui->textEdit->appendPlainText("本机主机名:"+hostName+"\n");

    QHostInfo   hostInfo=QHostInfo::fromName(hostName);  //本机IP地址
    QList<QHostAddress> addrList=hostInfo.addresses();    //IP地址列表
    if (addrList.isEmpty())
        return;

    foreach (QHostAddress host, addrList) // host表示每一个ip地址
    {
        bool show=ui->chkBox_OnlyIPv4->isChecked();   //只显示IPv4
        show= show? (host.protocol()==QAbstractSocket::IPv4Protocol):true;
        if (show)
        {
            ui->textEdit->appendPlainText("协 议:"+protocolName(host.protocol())); //协议类型
            ui->textEdit->appendPlainText("本机IP地址:"+host.toString());           //IP地址
            ui->textEdit->appendPlainText(QString("isGlobal()=%1\n").arg(host.isGlobal()));
            //            ui->textEdit->appendPlainText(QString("isBroadcast()=%1").arg(host.isBroadcast()));
            //            ui->textEdit->appendPlainText(QString("isLoopback()=%1").arg(host.isLoopback()));
            //            ui->textEdit->appendPlainText(QString("isMulticast()=%1\n").arg(host.isMulticast()));
        }
    }
}

void MainWindow::do_lookedUpHostInfo(const QHostInfo &host)
{//查找主机信息的槽函数
    QList<QHostAddress> addrList=host.addresses();   //获取主机的地址列表
    if (addrList.isEmpty())
        return;
    foreach(QHostAddress host, addrList)
    {
        bool show=ui->chkBox_OnlyIPv4->isChecked();   //只显示IPv4
        show= show? (host.protocol()==QAbstractSocket::IPv4Protocol):true;
        if (show)
        {
            ui->textEdit->appendPlainText("协 议:"+protocolName(host.protocol()));
            ui->textEdit->appendPlainText(host.toString());
            ui->textEdit->appendPlainText(QString("isGlobal()=%1\n").arg(host.isGlobal()));
        }
    }
}
void MainWindow::on_btnLookup_clicked()
{//"查找域名的IP地址" 按钮
    ui->textEdit->clear();
    QString hostname=ui->comboBox->currentText();     //读取主机名
    ui->textEdit->appendPlainText("正在查找查找主机信息:"+hostname);
    QHostInfo::lookupHost(hostname,this,SLOT(do_lookedUpHostInfo(QHostInfo)));
}

void MainWindow::on_btnAllAddress_clicked()
{//"allAddresses()"按钮
    ui->textEdit->clear();
    QList<QHostAddress> addrList=QNetworkInterface::allAddresses();
    if (addrList.isEmpty())
        return;
    foreach (QHostAddress host, addrList)
    {
        bool show=ui->chkBox_OnlyIPv4->isChecked();//只显示IPv4
        show= show? (host.protocol()==QAbstractSocket::IPv4Protocol):true;
        if (show)
        {
            ui->textEdit->appendPlainText("协  议:"+protocolName(host.protocol()));
            ui->textEdit->appendPlainText("IP地址:"+host.toString());
            ui->textEdit->appendPlainText(QString("isGlobal()=%1\n").arg(host.isGlobal()));
        }
    }
}


void MainWindow::on_btnAllInterface_clicked()
{//"allInterfaces()"按钮
    ui->textEdit->clear();
    QList<QNetworkInterface> list=QNetworkInterface::allInterfaces();   //网络接口列表
    foreach(const auto& item,list) // QNetworkInterface interface,list
    {
        if (!item.isValid())
            continue;

        ui->textEdit->appendPlainText("设备名称:"+item.humanReadableName());
        ui->textEdit->appendPlainText("硬件地址:"+item.hardwareAddress());
        ui->textEdit->appendPlainText("接口类型:"+interfaceType(item.type()));
        QList<QNetworkAddressEntry> entryList=item.addressEntries();   //地址列表
        foreach(const auto& entry, entryList) // QNetworkAddressEntry entry, entryList
        {
            ui->textEdit->appendPlainText("   IP 地址:"+entry.ip().toString());
            ui->textEdit->appendPlainText("   子网掩码:"+entry.netmask().toString());
            ui->textEdit->appendPlainText("   广播地址:"+entry.broadcast().toString()+"\n");
        }
    }
}

QString MainWindow::interfaceType(QNetworkInterface::InterfaceType type)
{//根据枚举值返回字符串
    switch(type)
    {
    case QNetworkInterface::Unknown:
        return "Unknown";
    case QNetworkInterface::Loopback:
        return "Loopback";
    case QNetworkInterface::Ethernet:
        return "Ethernet";
    case QNetworkInterface::Wifi:
        return "Wifi";
    default:
        return "Other type";
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值