Qt网络通信——获取本机网络信息

查询一个主机的MAC地址或者IP地址是网络应用中常用到的功能,Qt提供了QHostInfo和QNetworkInterface 类可以用于此类信息的查询

1.QHostInfo 类(显示和查找本地的信息)是的主要函数

 类别 函数原型作用
公共函数QList <QHostAdress> address()返回与hostName()主机关联的IP地址列表
QString hostName()返回通过IP查找的主机的名称
静态函数QHostInfo fromName(QSring &name)返回指定主机名的IP地址
QHostInfo localHostName()返回本机的主机名
int lookupHost(QString &name,QObject *receiver,char*member)以异步方式根据主机名查找主机的IP地址,并返回一个表示本次查找的ID,可用于abortHostLookup()

int lookupHost(QString &name,QObject *receiver,char*member)

name可以是主机名,可以是域名或者是一个IP地址。receiver和member指定一个响应函数的接收者和槽函数名称。

2.QNetworkInterface 类(获得应用程序上所在主机的所有网络接口,包括子网掩码和广播地址等)的主要函数

类别 函数原型作用
公共函数QList <QNetworkAddressEntry> addressEntries()返回该网络接口(包括子网掩码和广播地址)的IP列表
QString   hardwareAddress()返回该接口的低级硬件地址,以太网里就是MAC地址
QString  humanReadableName()

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

bool isValid()如果接口信息有效就返回true
QString name()返回网络接口名称
静态函数QList <QHostAddress> allAddress()返回主机上所有IP地址的列表
QList <QNetworkInterface> allInterfaces()返回主机上所有接口的网络列表

QNetworkInterface 中包含的网络信息接口有IP地址,子网掩码和广播地址

分别用:ip()、netmask() 、broadcast()函数返回

NetworkInformation.h
#ifndef NETWORKINFORMATION_H
#define NETWORKINFORMATION_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QMessageBox>
#include <QGridLayout>
#include <QHostInfo>
#include <QNetworkInterface>
class NetworkInformation : public QWidget
{
    Q_OBJECT

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

    void getHostInformation();  //获取主机信息

public slots:
    void slotDetail();

private:

    QLabel *lab_host;
    QLineEdit *lineEdit_hostName;

    QLabel *lab_IpAdress;
    QLineEdit *lineEdit_IpAdress;

    QPushButton *btn_detail;
    QGridLayout *mainLayout;


};
#endif // NETWORKINFORMATION_H

NetworkInformation.cpp

#include "networkinformation.h"

NetworkInformation::NetworkInformation(QWidget *parent)
    : QWidget(parent)
{


    lab_host=new QLabel(QStringLiteral("主机名:"));
    lineEdit_hostName=new QLineEdit;

    lab_IpAdress=new QLabel(QStringLiteral("IP地址:"));
    lineEdit_IpAdress=new QLineEdit;

    btn_detail=new QPushButton(QStringLiteral("详细"));

    mainLayout=new QGridLayout;
    mainLayout->addWidget(lab_host,0,0);
    mainLayout->addWidget(lineEdit_hostName,0,1);
    mainLayout->addWidget(lab_IpAdress,1,0);
    mainLayout->addWidget(lineEdit_IpAdress,1,1);
    mainLayout->addWidget(btn_detail,2,0,1,2);
    mainLayout->addWidget(lab_host,0,0);

    setLayout(mainLayout);

    getHostInformation();
    connect(btn_detail,SIGNAL(clicked()),this,SLOT(slotDetail()));

}

NetworkInformation::~NetworkInformation()
{
}

//获取主机信息
void NetworkInformation::getHostInformation()
{
   QString localHostName=QHostInfo::localHostName();   //获取主机名
   lineEdit_hostName->setText(localHostName);

   QHostInfo hostInfo=QHostInfo::fromName(localHostName);//本机的IP地址

   QList<QHostAddress> listAdress=hostInfo.addresses();  //IP地址列表
   if(!listAdress.isEmpty())
   {
       lineEdit_IpAdress->setText(listAdress.first().toString());  //如果主机的IP列表不为空,则使用其第一个IP地址
   }

}

//获得与网络接口相关的信息
void NetworkInformation::slotDetail()
{
   QString detail="";
   QList<QNetworkInterface> list=QNetworkInterface::allInterfaces(); //主机上所有的接口的网络列表

   for(int i=0;i<list.count();i++)
   {
       QNetworkInterface interface=list.at(i);

       detail=detail+(QStringLiteral("设备:"))+interface.name()+'\n'; // 获取网络接口的名字
       detail=detail+(QStringLiteral("硬件地址:"))+interface.hardwareAddress()+'\n';//获取网络接口的硬件地址

       QList<QNetworkAddressEntry> entryList=interface.addressEntries();  //返回网络接口(包括子网掩码和广播地址)的Ip地址列表
       for(int j=0;j<list.count();j++)
        {
           QNetworkAddressEntry entry=entryList.at(i);

           detail=detail+'\t'+(QStringLiteral("IP地址:"))+entry.ip().toString()+'\n';
           detail=detail+'\t'+(QStringLiteral("子网掩码:"))+entry.netmask().toString()+'\n';
            detail=detail+'\t'+(QStringLiteral("广播地址:"))+entry.broadcast().toString()+'\n';
        }
       QMessageBox::information(this,(QStringLiteral("Detail")),detail);
   }

}

结果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt界面通过网络获取天气信息的过程,一般可以分为以下几个步骤: 第一步,创建请求对象。使用Qt提供的QNetworkRequest类创建一个请求对象,设置请求的URL地址以及请求的Header信息。 第二步,发送请求。使用Qt的QNetworkAccessManager类发送上述请求对象,调用其get()函数即可发送请求。 第三步,接收相应。Qt的QNetworkAccessManager类会自动接收到服务器的相应信息,可以通过其finished()信号捕捉到这个事件,回调函数中则可以读取响应的信息。 第四步,解析数据。一般天气信息返回的是Json格式数据,我们需要使用Qt的Json解析器Qt Json来解析数据,将其转换成相应的数据结构,例如用QJsonObject表示城市名、温度、天气状况等信息。 第五步,更新UI。将第四步中解析得到的数据结构,通过Qt界面的QLabel、QTextBrowser等控件,动态地更新显示在界面上。 需要注意在整个网络获取天气信息的过程中,需要添加相应的错误处理,例如网络连接失败、天气数据解析出错等等情况,以保证界面能够及时地响应用户的操作。 ### 回答2: Qt界面是一种基于C++的图形用户界面开发框架。这种框架可以帮助开发者创建出漂亮、易于使用、跨平台的应用程序界面。Qt界面中内置了许多通信和网络相关的类库,使得开发者可以很方便地利用网络进行数据的获取和传输。 获取天气信息通常需要连接到一个天气服务的API,通过发送HTTP请求来获取数据,再将数据解析回传给应用程序进行处理。在Qt界面中,可以使用QNetworkAccessManager等相关类库来实现这个过程。具体而言,可以通过下列步骤来实现: 1. 创建一个QNetworkAccessManager对象,该对象可以用于发送HTTP请求和接收响应数据。 2. 构造HTTP请求对象。对于获取天气信息,通常需要指定一个特定的URL,以及HTTP请求头部的一些参数,例如浏览器类型、语言等。 3. 发送HTTP请求,并等待响应。当响应数据到达时,QNetworkAccessManager对象会发出相应的信号,用于通知应用程序已经得到响应数据。 4. 按照天气API返回的格式,解析响应数据,并提取所需要的信息。这部分工作需要根据具体API的规定进行实现。 5. 将解析获得的天气信息显示在Qt界面上。这一过程中,可以利用Qt的控件和布局等功能,将获取到的信息以适当的方式进行展示。 综上所述,Qt界面通过网络获取天气信息可以利用QNetworkAccessManager等类库,通过发送HTTP请求、解析响应数据实现。这种方法具有可靠性高、代码清晰等优点,可以满足大多数天气API的调用需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值