qt入门--网络编程


一、演示demo

在这里插入图片描述
在这里插入图片描述

1.1代码示例

1.1.1 h头文件

#ifndef FORM_H
#define FORM_H
#include <QWidget>
#include "TitleBar/basewidget.h"
#include "TitleBar/commonhelp.h"
#include<QAbstractSocket>
#include<QHostInfo>
namespace Ui {
class Form;
}

class Form : public BaseWidget
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent [in]   parent指针
    */
    explicit Form(QWidget *parent = nullptr);
    ~Form();
    /**
     * @brief 获取协议类型
     * @param protocal [in]   协议类型
    */
    QString protocalName(QAbstractSocket::NetworkLayerProtocol protocal);

private slots:
    /**
     * @brief 主机信息主机名和IP
     * @param host [in]   主机信息
    */
    void lookedUpHostInfo(const QHostInfo &host);

private slots:
    /**
     * @brief 获取主机信息槽函数
     * @param
    */
    void on_btnGetHostInfo_clicked();
    /**
     * @brief 清空槽函数
     * @param
    */
    void on_btnClear_clicked();
    /**
     * @brief 获取所有网络信息槽函数
     * @param
    */
    void on_btnAllInterfaces_clicked();
    /**
     * @brief 主机信息IP槽函数
     * @param
    */
    void on_btnAllAdderse_clicked();
    /**
     * @brief 查找域名和IP地址槽函数
     * @param
    */
    void on_btnLookUp_clicked();

private:
    Ui::Form *ui;
};
#endif // FORM_H


1.1.2 cpp文件

#include "form.h"
#include "ui_form.h"
#include<QHostInfo>
#include<QNetworkInterface>
Form::Form(QWidget *parent) :
    BaseWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
    setWindowTitle(QStringLiteral("qt网络编程"));
    setTitleBarIcon("E:/F盘/user_operator.png");
    QGridLayout* lay = new QGridLayout;
    lay->addWidget(ui->widget);
    lay->setContentsMargins(0,0,0,0);
    contentWidget()->setLayout(lay);
    setWindowTitleHeight(60);
    CommonHelper::setStyleSheet(":/user3.qss");
    setBackgroundColor(56,61,70,false);
}

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

QString Form::protocalName(QAbstractSocket::NetworkLayerProtocol protocal)
{
    switch (protocal) {
    case QAbstractSocket::IPv4Protocol:
        return "IPV4 protocal";
    case QAbstractSocket::IPv6Protocol:
        return "IPV6 protocal";
    case QAbstractSocket::AnyIPProtocol:
        return "Any IP protocal";
    default:
        return "Unknown NetWork protocal";
    }
}

void Form::lookedUpHostInfo(const QHostInfo &host)
{
    QList<QHostAddress> addList=host.addresses();
    if(!addList.isEmpty())
    {
        for(int i=0;i<addList.count();i++)
        {
            QHostAddress aHost=addList.at(i);
            bool show=ui->cheOnlyIPV4->isChecked();
            if(show)
                show=(QAbstractSocket::IPv4Protocol==aHost.protocol());
            else {
                show=true;
            }
            if(show)
            {
                ui->plainTextEdit->appendPlainText("协议:"+protocalName(aHost.protocol()));
                ui->plainTextEdit->appendPlainText(aHost.toString());
            }
        }
    }
}

void Form::on_btnGetHostInfo_clicked()
{
    QString hostName=QHostInfo::localHostName();
    ui->plainTextEdit->appendPlainText("本机主机名:"+hostName+"\n");
    QHostInfo hostInfo=QHostInfo::fromName(hostName);
    QList<QHostAddress> addList=hostInfo.addresses();
    if(!addList.isEmpty())
    {
        for(int i=0;i<addList.count();i++)
        {
            QHostAddress aHost=addList.at(i);
            bool show=ui->cheOnlyIPV4->isChecked();
            if(show)
            {
                show=(QAbstractSocket::IPv4Protocol==aHost.protocol());
            }
            else {
                show=true;
            }
            if(show)
            {
                ui->plainTextEdit->appendPlainText("协议:"+protocalName(aHost.protocol()));
                ui->plainTextEdit->appendPlainText("本机IP地址:"+aHost.toString());
                ui->plainTextEdit->appendPlainText(" ");
            }
        }
    }
}

void Form::on_btnClear_clicked()
{
    ui->plainTextEdit->clear();
}

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

void Form::on_btnAllAdderse_clicked()
{
	//获取所有网络接口的列表
    QList<QNetworkInterface> list=QNetworkInterface::allInterfaces();
    //显示每个接口的humanReadable Name()和hardwareAddress()。每个接口又有一个QNetworkAddressEntry类型的地址列表,通过addressEntries ()获得这个列表。
//QNetworkAddressEntry包含了一个网络接口的IP地址、子网掩码和广播地址,分别用ip()、netmask()和broadcast()函数返回。
    for(int i=0;i<list.count();i++)
    {
        QNetworkInterface aInterface=list.at(i);
        if(!aInterface.isValid())
        {
            continue;
        }
        QList<QNetworkAddressEntry> entryList=aInterface.addressEntries();
        for(int j=0;j<entryList.count();j++)
        {
            QNetworkAddressEntry aEntry=entryList.at(j);
            ui->plainTextEdit->appendPlainText("IP地址:"+aEntry.ip().toString());
            ui->plainTextEdit->appendPlainText("子网掩码:"+aEntry.netmask().toString());
            ui->plainTextEdit->appendPlainText("广播地址:"+aEntry.broadcast().toString()+"\n");
        }
        ui->plainTextEdit->appendPlainText("\n");
    }
}

void Form::on_btnLookUp_clicked()
{
    QString hostname=ui->editHost->text();
    ui->plainTextEdit->appendPlainText("正在查询主机信息:"+hostname);
    QHostInfo::lookupHost(hostname,this,SLOT(lookedUpHostInfo(const QHostInfo &)));
}

1.2 代码详解

  1. 通过静态函数QHostInfo::localHostName()获取本机主机名hostName,然后再使用主机名作为参数,用静态函数QHostInfo::fromName(hostName)获取主机的信息hostInfo。
    hostInfo是QHostInfo类的实例,通过其函数addresses()获取主机的IP地址列表。
    QList addList=hostInfo.addresses();返回的addList是QHostAddress类的列表,QHostAddress类提供一个IP地址的信息,包括IPv4地址和IPv6地址。QHostAddress有以下两个主要的函数。
    protocol() 返回QAbstractSocket::NetworkLayerProtocol类型变量,表示当前IP地址的协议类型。QAbstractSocket::NetworkLayerProtocol枚举类型的取值。
    aHost.toString () 返回IP地址的字符串,表示程序中显示了IP地址列表中每个IP地址的协议类型和IP地址字符串,为根据protocol()返回的QAbstractSocket::NetworkLayerProtocol枚举值显示协议名称字符串,自定义了一个函数protocolName(),代码如下:QString Form::protocolName(QAbstractSocket::NetworkLayerProtocol protocol)
    “主机名和IP地址"按钮,如果勾选了“只显示 IPv4协议地址”复选框,就只显示本机的IPv4地址,否则显示所有IP地址信息。
  2. 查找主机地址信息
    QHostInfo的静态函数lookupHost()可以根据主机名、域名或IP地址查找主机的地址信息,lookupHost()函数原型如下:int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member)输入参数name是表示主机名的字符串,可以是一个主机名、一个域名,或者是一个IP地址。
    lookupHost()以异步方式查找主机地址,参数receiver和member指定一个响应槽函数的接收者和槽函数名称。执行lookupHost()后,程序可能需要花一定时间来查找主机地址,但不会阻塞程序的运行。当查找到主机地址后,通过信号通知设定的槽函数,在槽函数里读取查找的结果。函数返回一个表示查找的ID。

二、主机信息

查询一个主机的MAC地址或IP地址是网络应用程序中经常用到的功能,Qt提供了QHostInfo和QNetworkInterface类可以用于此类信息的查询。
QHostInfo的静态函数localHostName()可获取本机的主机名,静态函数fromName()可以通过主机名获取IP地址,静态函数lookupHost()可以通过一个主机名,以异步方式查找这个主机的IP地址。
QHostInfo类的主要函数如下
在这里插入图片描述

QNetworkInterface可以获得运行应用程序的主机的所有IP地址和网络接口列表。静态函数allInterfaces()返回主机上所有的网络接口的列表,一个网络接口可能包括多个的IP地址,每个IP地址与掩码或广播地址关联。如果无需知道子网掩码和广播的IP地址,使用静态函数allAddresses()可以获得主机上的所有IP地址列表。下表是QNetworkInterface类的主要功能函数。
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本课程详细、全面地介绍了 Qt 开发中的各个技术细节,并且额外赠送在嵌入式端编写Qt程序的技巧。整个课程涵盖知识点非常多,知识模块囊括 Qt-Core 组件、QWidgets、多媒体、网络、绘图、数据库,超过200个 C++ 类的分析和使用,学完之后将拥有 Qt 图形界面开发的非常坚实的功底。 每个知识点不仅仅会通过视频讲解清楚,并且会配以精心安排的实验和作业,用来保证学习过程中切实掌握核心技术和概念,通过实验来巩固,通过实验来检验,实验与作业的目的是发现问题,发现技术盲点,通过答疑和沟通夯实技术技能。注意:本套视频教程来源于线下的实体班级,因此视频中有少量场景对话和学生问答,对此比较介意的亲们谨慎购买。注意:本套视频教程包含大量课堂源码,包含对应每个知识点的精心编排的作业。由于CSDN官方规定在课程介绍中不能出现作者的联系方式,因此在这里无法直接给出QQ答疑号,视频中的源码、资料和作业文档链接统一在购买后从CSDN平台跟我沟通,我会及时回复跟进。注意:本套视频教程包含全套10套作业题,覆盖所有视频知识点,循序渐进,各个击破,作业总纲如下:下面是部分作业题目展示,每道题都有知识点说明,是检验学习效果的一大利器:(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)…… ……

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘客-追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值