【QT】QHostInfo 和 QNetworkInterface 的使用

news2025/1/12 20:06:28

目录

  • 1. Qt网络模块
  • 2. QHostInfo
    • 2.1 公共函数
    • 2.2 静态函数
  • 3. QNetworkInterface
    • 3.1 公共函数
    • 3.2 静态函数
  • 4. 代码示例
    • Dialog.h
    • Dialog.cpp
    • 界面展示

1. Qt网络模块

使用Qt网络模块,需要在配置文件.pro中添加:

Qt += network

2. QHostInfo

2.1 公共函数

QList<QHostAddress> addresses() 返回与hostName()主机关联的Ip地址列表

QString hostName() 返回已查询其IP地址的主机的名称

int lookupId() 返回本次查找的ID

QHostInfoError error() 若主机查找失败,返回失败类型

QString errorString() 若主机查找失败,返回错误描述字符串

2.2 静态函数

QString localHostName() 返回本机的主机名

QHostInfo fromName(QString& name) 通过主机名获取IP地址

QString localDomainName() 返回本机的DNS域名

int lookupHost(QString& name, QObject* receiver, char* member) 以异步方式根据主机名查找主机IP地址,返回本次查找的ID,用于abortHostLookup()

void abortHostLookup(int id) 用lookupHost()返回的ID ID中止主机查找

3. QNetworkInterface

3.1 公共函数

QList<QNetworkAddressEntry> addressEntries() 返回该网络接口(包括子网掩码和广播地址)的IP地址列表

QString hardwareAddress() 返回该接口的低级硬件地址,以太网里就是MAC地址

QString name() 返回网络接口名称

QString humanReadableName() 返回可以读懂的接口名称,如果名称不确定,得到的就是name()函数的返回值

bool isValid() 若接口信息有效就返回true

3.2 静态函数

QList<QHostAddress> allAddresses() 返回主机上所有IP地址的列表

QList<QNetworkInterface> allInterfaces() 返回主机上所有接口的网络列表
一个网络接口可能包含多个IP地址,每个IP地址与掩码或广播地址关联。如果无需知道子网掩码和广播的Ip地址,可以使用allAdresses()获得主机的所有IP地址列表

4. 代码示例

Dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QCheckBox>
#include <QDialog>
#include <QGridLayout>
#include <QHostInfo>
#include <QLineEdit>
#include <QNetworkInterface>
#include <QPlainTextEdit>
#include <QPushButton>

namespace Ui {
    class Dialog;
}

class Dialog : public QDialog {
    Q_OBJECT

public:
    explicit Dialog(QWidget* parent = 0);
    ~Dialog();

private:
    //根据QAbstractSocket::NetworkLayerProtocol的枚举类型,返回协议名称的字符串
    QString protocolType(QAbstractSocket::NetworkLayerProtocol protocol);

private slots:
    void slotBtnGetHostInfoClicked();
    void slotBtnLookupHostInfoClicked();
    void slotLookupHostInfo(const QHostInfo& host);
    void slotBtnAllInterfaceClicked();
    void slotBtnAllAddressClicked();
    void slotClearTextClicked();

private:
    Ui::Dialog* ui;
    QPushButton* m_pBtnGetHostInfo;
    QCheckBox* m_pCheckIPv4;
    QPushButton* m_pBtnLookupHostInfo;
    QLineEdit* m_pEditHost;
    QPushButton* m_pBtnAllInterface;
    QPushButton* m_pBtnAllAddress;
    QPlainTextEdit* m_pTextShowInfo;
    QPushButton* m_pClearText;
};

#endif  // DIALOG_H

Dialog.cpp

#include "dialog.h"

#include "ui_dialog.h"

Dialog::Dialog(QWidget* parent) : QDialog(parent), ui(new Ui::Dialog) {
    ui->setupUi(this);
    this->setWindowTitle(QStringLiteral("网络主机信息"));

    //    m_pBtnGetHostInfo = new QPushButton(this);
    //    m_pBtnGetHostInfo->setText(QStringLiteral("获取本机主机名和IP地址"));
    m_pBtnGetHostInfo = new QPushButton(QStringLiteral("获取本机主机名和IP地址"), this);
    m_pCheckIPv4 = new QCheckBox(QStringLiteral("只显示IPv4协议地址"), this);
    m_pCheckIPv4->setCheckState(Qt::Checked);
    m_pCheckIPv4->setLayoutDirection(Qt::RightToLeft);  //更改复选框的位置在右边
    m_pBtnLookupHostInfo = new QPushButton(QStringLiteral("查找域名的IP地址"), this);
    m_pEditHost = new QLineEdit(QStringLiteral("www.baidu.com"), this);
    m_pBtnAllInterface = new QPushButton(QStringLiteral("QNetworkInterface::allInterface"), this);
    m_pBtnAllAddress = new QPushButton(QStringLiteral("QNetworkInterface::allAddress"), this);
    QGridLayout* GLay1 = new QGridLayout();
    GLay1->addWidget(m_pBtnGetHostInfo, 0, 0);
    GLay1->addWidget(m_pCheckIPv4, 0, 1, Qt::AlignHCenter);
    GLay1->addWidget(m_pBtnLookupHostInfo, 1, 0);
    GLay1->addWidget(m_pEditHost, 1, 1);
    GLay1->addWidget(m_pBtnAllInterface, 2, 0);
    GLay1->addWidget(m_pBtnAllAddress, 2, 1);

    m_pTextShowInfo = new QPlainTextEdit(this);
    m_pClearText = new QPushButton(QStringLiteral("清空文本框"), this);

    QGridLayout* GLay = new QGridLayout(this);
    GLay->addLayout(GLay1, 0, 0);
    GLay->addWidget(m_pTextShowInfo);
    GLay->addWidget(m_pClearText);

    connect(m_pBtnGetHostInfo, &QPushButton::clicked, this, &Dialog::slotBtnGetHostInfoClicked);
    connect(m_pBtnLookupHostInfo, &QPushButton::clicked, this, &Dialog::slotBtnLookupHostInfoClicked);
    connect(m_pBtnAllInterface, &QPushButton::clicked, this, &Dialog::slotBtnAllInterfaceClicked);
    connect(m_pBtnAllAddress, &QPushButton::clicked, this, &Dialog::slotBtnAllAddressClicked);
    connect(m_pClearText, &QPushButton::clicked, this, &Dialog::slotClearTextClicked);
}

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

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

void Dialog::slotBtnGetHostInfoClicked() {
    QString hostName = QHostInfo::localHostName();  //本地主机名
    m_pTextShowInfo->appendPlainText("本地主机名:" + hostName + "\n");
    QHostInfo hostIP = QHostInfo::fromName(hostName);  //本机IP
    QList<QHostAddress> addList = hostIP.addresses();  // IP地址列表
    if (!addList.isEmpty()) {
        for (int i = 0; i < addList.count(); i++) {
            QHostAddress ipAddr = addList.at(i);  //每一项是一个QHostAddress
            bool isCheck = m_pCheckIPv4->isChecked();
            if (isCheck)
                isCheck = (QAbstractSocket::IPv4Protocol == ipAddr.protocol());  //只显示IPv4
            else
                isCheck = true;
            if (isCheck) {
                m_pTextShowInfo->appendPlainText("协议:" + protocolType(ipAddr.protocol()));
                m_pTextShowInfo->appendPlainText("本机IP地址:" + ipAddr.toString());
            }
        }
        m_pTextShowInfo->appendPlainText("-----------------------------");
    }
}

void Dialog::slotBtnLookupHostInfoClicked() {
    QString hostName = m_pEditHost->text();
    m_pTextShowInfo->appendPlainText("正在查找主机信息:" + hostName);
    QHostInfo::lookupHost(hostName, this, SLOT(slotLookupHostInfo(QHostInfo)));  // SLOT方式的槽函数需注明参数类型
}

void Dialog::slotLookupHostInfo(const QHostInfo& host) {
    QList<QHostAddress> addList = host.addresses();
    if (!addList.isEmpty()) {
        for (int i = 0; i < addList.count(); i++) {
            QHostAddress hostAddr = addList.at(i);
            bool isCheck = m_pCheckIPv4->isChecked();
            if (isCheck)
                isCheck = (QAbstractSocket::IPv4Protocol == hostAddr.protocol());
            else
                isCheck = true;
            if (isCheck) {
                m_pTextShowInfo->appendPlainText("协议:" + protocolType(hostAddr.protocol()));
                m_pTextShowInfo->appendPlainText("IP地址:" + hostAddr.toString());
            }
        }
        m_pTextShowInfo->appendPlainText("-----------------------------");
    }
}

void Dialog::slotBtnAllInterfaceClicked() {
    QList<QNetworkInterface> interfaceList = QNetworkInterface::allInterfaces();
    if (interfaceList.isEmpty())
        return;
    for (int i = 0; i < interfaceList.count(); i++) {
        QNetworkInterface aInterface = interfaceList.at(i);
        if (!aInterface.isValid())
            continue;
        m_pTextShowInfo->appendPlainText("设备名称:" + aInterface.humanReadableName());
        m_pTextShowInfo->appendPlainText("硬件地址:" + aInterface.hardwareAddress() + "\n");
        QList<QNetworkAddressEntry> entryList = aInterface.addressEntries();
        if (entryList.isEmpty())
            return;
        for (int i = 0; i < entryList.count(); i++) {
            QNetworkAddressEntry aEntry = entryList.at(i);
            m_pTextShowInfo->appendPlainText("IP地址:" + aEntry.ip().toString());
            m_pTextShowInfo->appendPlainText("子网掩码:" + aEntry.netmask().toString());
            m_pTextShowInfo->appendPlainText("广播地址:" + aEntry.broadcast().toString() + "\n");
        }
    }
    m_pTextShowInfo->appendPlainText("-----------------------------");
}

void Dialog::slotBtnAllAddressClicked() {
    QList<QHostAddress> addList = QNetworkInterface::allAddresses();
    if (addList.isEmpty())
        return;
    for (int i = 0; i < addList.count(); i++) {
        QHostAddress aHost = addList.at(i);
        bool show = m_pCheckIPv4->isChecked();
        if (show)
            show = QAbstractSocket::IPv4Protocol == aHost.protocol();
        else
            show = true;
        if (show) {
            m_pTextShowInfo->appendPlainText("协议:" + protocolType(aHost.protocol()));
            m_pTextShowInfo->appendPlainText("IP地址:" + aHost.toString());
        }
    }
    m_pTextShowInfo->appendPlainText("-----------------------------");
}

void Dialog::slotClearTextClicked() { m_pTextShowInfo->clear(); }

界面展示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10分钟学会Jmeter接口测试

一提到接口测试&#xff0c;通常大家会有这样的疑问&#xff1a;前端测试不是已经覆盖到各种业务逻辑了吗&#xff1f;为什么还要做接口测试&#xff0c;接口测试和前端测试是不是重复了&#xff1f;对于这个问题&#xff0c;可以从下面几个方面来解释&#xff1a; 什么是接口…

OpenMMLab AI实战营 第6课 语义分割与MMSegmentation

第6课 语义分割与MMSegmentation 1. 语义分割简介 任务&#xff1a;将图像按照物体的类别分割成不同的区域&#xff0c;等价于对每个像素进行分类应用 无人驾驶人像分割智能遥感医疗影像分析 语义分割 vs 实例分割 vs 全景分割 语义分割&#xff1a;仅考虑像素的类别&#xf…

如何利用火遍全球的ChatGPT搞钱?

火遍全球的ChatGPT想必大家都知道了。已经有人借助它赚到了2023年的第一桶金&#xff0c;连比尔盖茨都称赞ChatGPT不亚于互联网的诞生。还有人借助Chagpt通过了Google面试&#xff0c;拿到了年薪18万美元的工程师offer。要明白&#xff0c;年薪百万的谷歌程序员&#xff0c;对于…

百度富文本UE的问题集合

百度富文本编辑能上传视频成功但是在浏览器不能播放、显示的问题百度富文本视频封面空白问题百度富文本编辑器UMEditor 添加视频无法删除百度富文本编辑器结果存数据库取出来到js赋值报错怎么让浏览器重新加载修改过的JS文件&#xff0c;而不是沿用缓存里的百度富文本编辑能上传…

智慧物流管理系统

智慧物流运用物联网、大数据、云计算、人工智能等技术优化物流决策过程。智慧物流获取、分析物流信息并做出决策&#xff0c;从商品源开始实时跟踪与管理&#xff0c;保证信息流快于商品流&#xff0c;实现信息与物质快速、高效、流畅地运转&#xff0c;集自动化、数字化、网络…

浏览器如何使用HTTP防止ip限制

当我们浏览网页尤其是频发刷新网页时&#xff0c;会跳出来验证码。主要因为频繁刷新导致目标网页限制了您本地ip&#xff0c;正常过一段时间也或许恢复&#xff0c;如果遇到紧急的事情急需访问&#xff0c;不妨试试下面的操作。不管是网页还是电脑游戏都可以通过改变地址实现防…

Linux内核移植(源码分析、配置与编译)

目录 一、Linux内核概述 1.1内核与操作系统 ​编辑1.2Linux层次结构 1.3Linux内核特点 二、Linux内核源码结构 2.1Linux内核源码获取 2.2Linux内核源码结构 三、Linux内核源码的配置和编译 3.1Linux内核源码配置 3.2make menuconfig 3.3内核编译&#xff08;以下命令…

Java学习记录day6

书接上回 类与对象 static关键字 static的作用&#xff1a; 修饰一个属性&#xff1a;声明为static的变量实质上就是一个全局变量,其生命周期为从类被加载开始一直到程序结束&#xff1b;修饰方法&#xff1a;无须本类的对象也可以调用该方法&#xff1b;修饰一个类&#x…

Yii中render和renderPartial的区别

一、Yii项目来源二、配置yiisoft/yii2-app-basic&#xff0c;写个Demo1、默认的首页2、自定义Demo的html内容3、php渲染代码1&#xff09;、render() 渲染2&#xff09;、renderPartial() 渲染三、给出结论一、Yii项目来源 直接composer安装&#xff1a;composer create-proje…

注意力机制(SE,ECA,CBAM) Pytorch代码

注意力机制1 SENet2 ECANet3 CBAM3.1 通道注意力3.2 空间注意力3.3 CBAM4 展示网络层具体信息1 SENet SE注意力机制&#xff08;Squeeze-and-Excitation Networks&#xff09;:是一种通道类型的注意力机制&#xff0c;就是在通道维度上增加注意力机制&#xff0c;主要内容是是…

【光线追踪】光线追踪重投影方法(Ray Tracing Reprojection)

光线追踪重投影方法 重投影这项技术一般用于时间性帧复用技术上&#xff0c;例如TAA(Temporal Anti-Aliasing)反走样或者抗锯齿技术。读这篇文章最好先对TAA这类技术的算法流程有了解。 1.TAA抗锯齿技术简介 先简单介绍下TAA抗锯齿的原理&#xff0c;在游戏中&#xff0c;当前…

解决ThinkPHP5.1出现MISS缓存未命中问题

一淘模板&#xff08;56admin.com&#xff09;给大家带来了关于ThinkPHP5.1的相关知识&#xff0c;其中主要介绍了CDN是什么&#xff1f;为什么使用它&#xff1f;怎么解决ThinkPHP5.1 MISS缓存未命中问题&#xff1f;感兴趣的朋友下面一起来看一下吧&#xff0c;希望对大家有帮…

疑难杂症篇(二十一)--Ubuntu18.04安装usb-cam过程出现的问题

对Ubuntu18.04{\rm Ubuntu 18.04}Ubuntu18.04环境下的ROS{\rm ROS}ROS的melodic{\rm melodic}melodic版本安装usb−cam{\rm usb-cam}usb−cam过程出现的两个常见问题提出解决方案。 1.问题1&#xff1a;usb-cam功能包编译时出现"未定义的引用"的问题 问题描述&#…

@RefreshScope 加在 Quartz 触发器类导致异常问题分析

背景 承接上篇&#xff0c;测试过程中又遇到了 Nacos Config 的动态刷新注解 RefreshScope 与 Quartz 框架结合的问题&#xff0c;Bug 排查路上&#xff0c;顺手记录一下吧。 问题 有个模块使用了Quartz &#xff0c;通过配置控制任务调度的周期和分组名称。 因为引用了动态…

如何解决thinkphp验证码不能显示问题?

thinkPHP做验证码这一块,可以使用自带的验证码扩展,具体步骤如下: 一、安装扩展 composer require topthink/think-captcha 二、模版中使用 将原来静态页面的验证码图片替换为{:captcha_img()},这个会自动生成验证码图片。 <div>{:captcha_img()}</div> 或者 &…

如何理解 K8s 动态伸缩与触发上线?

K8s 版本&#xff1a;1.23.6 目录一、动态伸缩二、触发上线一般地&#xff0c;如果仅修改 Pod 的副本数&#xff08;如新增/缩减&#xff09;&#xff0c;这就属于动态伸缩。如果是修改容器镜像的版本&#xff0c;则会触发上线&#xff0c;具体看下面例子。 一、动态伸缩 1、…

00后整顿职场?公司测试岗却新来了个00后卷王,3个月薪资干到20K...

最近聊到软件测试的行业内卷&#xff0c;越来越多的转行和大学生进入测试行业。想要获得更好的待遇和机会&#xff0c;不断提升自己的技能栈成了测试老人迫在眉睫的问题。 不论是面试哪个级别的测试工程师&#xff0c;面试官都会问一句“会编程吗&#xff1f;有没有自动化测试…

Mybatis框架(全部基础知识)

&#x1f44c; 棒棒有言&#xff1a;也许我一直照着别人的方向飞&#xff0c;可是这次&#xff0c;我想要用我的方式飞翔一次&#xff01;人生&#xff0c;既要淡&#xff0c;又要有味。凡事不必太在意&#xff0c;一切随缘&#xff0c;缘深多聚聚&#xff0c;缘浅随它去。凡事…

2023年了,来试试前端格式化工具

在大前端时代&#xff0c;前端的各种工具链穷出不断&#xff0c;有eslint, prettier, husky, commitlint 等, 东西太多有的时候也是trouble&#x1f602;&#x1f602;&#x1f602;,怎么正确的使用这个是每一个前端开发者都需要掌握的内容&#xff0c;请上车&#x1f697;&…

DHCP Relay中继实验

DHCP Relay实验拓扑图设备配置结果验证拓扑图 要求PC1按照地址池自动分配&#xff0c;而PC要求分配固定的地址&#xff0c;网段信息已经在图中进行标明。 设备配置 AR1&#xff1a; AR1作为DHCP Server基本配置跟DHCP Server没区别&#xff0c;不过要加一条静态路由&#xff…