QT学习笔记(QT网络编程)
创始人
2025-05-31 13:48:42
0

QT网络编程

Qt 网络模块为我们提供了编写 TCP / IP 客户端和服务器的类。它提供了较低级别的类,例
如代表低级网络概念的 QTcpSocket,QTcpServer 和 QUdpSocket,以及诸如 QNetworkRequest,

QNetworkReplyQNetworkAccessManager 之类的高级类来执行使用通用协议的网络操作。 它
还提供了诸如QNetworkConfiguration,QNetworkConfigurationManager和QNetworkSession等类,
实现承载管理。

想要在程序中使用 Qt 网络模块,我们需要在 pro 项目配置文件里增加下面的一条语句。

QT += network \

获取本机的网络信息

为什么先写获取本机网络信息的内容呢?在建立网络通信之前我们至少得获取对方的 IP

地址。在网络应用中,经常需要用到本机的主机名、IP 地址、MAC 地址等网络信息,通常通
在 Windows 通过调出命令行 cmd 窗口输入 ipconfig 或者在 Linux 系统中使用 ifconfig 命令就可
以查看相关信息了,在这里我们利用 Qt 做出一个可以查询的界面和功能出来,为了后面的网络
编程打下一个简单的基础。
Qt 提供了 QHostInfo 和 QNetworkInterface 类可以用于此类信息查询。更多关于 QHostInfo

和 QNetworkInterface 的相关函数可以在 Qt 的帮助文档中找到。下面我们写代码时会使用到相
关的函数,有清楚的注释。

11.1.1 应用实例

本例目的:了解如何通过 QHostInfo 和 QNetworkInterface 类获取本地网络所有接口的信息。

例 07_networkhostinfo , 获 取 本 机 网 络 接 口 信 息 ( 难 度 : 一 般 )。 项 目 路 径 为

Qt/2/07_networkhostinfo。本例获取本机的网络接口信息,打印在文本浏览框上,点击按钮可直
接获取,为了清楚看见是重新获取的过程,本例点击获取本机信息按钮后延时 1s 去刷新获取的
信息。点击另一个清空文本信息按钮可以清空文本浏览框上的文本内容。

项目文件 07_networkhostinfo.pro 文件第一行添加的代码部分如下。

07_ networkhostinfo.pro 编程后的代码

1 QT += core gui network 2 3 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 4 5 CONFIG += c++11 6 7 # The following define makes your compiler emit warnings if you use 8 # any Qt feature that has been marked deprecated (the exact warnings 9 # depend on your compiler). Please consult the documentation of the 10 # deprecated API in order to know how to port your code away from it. 11 DEFINES += QT_DEPRECATED_WARNINGS 12 13 # You can also make your code fail to compile if it uses deprecated APIs. 14 # In order to do so, uncomment the following line. 15 # You can also select to disable deprecated APIs only up to a certain 
version of Qt. 16 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the 
APIs deprecated before Qt 6.0.0 17 18 SOURCES += \ 19 main.cpp \ 20 mainwindow.cpp 21 22 HEADERS += \ 23 mainwindow.h 24 25 # Default rules for deployment. 26 qnx: target.path = /tmp/$${TARGET}/bin 27 else: unix:!android: target.path = /opt/$${TARGET}/bin 28 !isEmpty(target.path): INSTALLS += target 

在头文件“mainwindow.h”具体代码如下。

mainwindow.h 编程后的代码

/****************************************************************** Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved. * @projectName 07_networkhostinfo * @brief mainwindow.h * @author Deng Zhimao * @email 1252699831@qq.com * @net www.openedv.com * @date 2021-04-10 *******************************************************************/ 1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include  5 #include  6 #include  7 #include  8 #include  9 #include  10 11 class MainWindow : public QMainWindow 12 { 13 Q_OBJECT 14 15 public: 16 MainWindow(QWidget *parent = nullptr); 17 ~MainWindow(); 18 19 private: 20 /* 点击获取和清空文本按钮 */ 21 QPushButton *pushButton[2]; 22 23 /* 文本浏览框用于显示本机的信息 */ 24 QTextBrowser *textBrowser; 25 26 /* 水平 Widget 容器和垂直 Widget 容器*/ 27 QWidget *hWidget; 28 QWidget *vWidget; 30 /* 水平布局和垂直布局 */ 31 QHBoxLayout *hBoxLayout; 32 QVBoxLayout *vBoxLayout; 33 34 /* 定时器 */ 35 QTimer *timer; 36 37 /* 获取本机的网络的信息,返回类型是 QString */ 38 QString getHostInfo(); 39 40 private slots: 41 /* 定时器槽函数,点击按钮后定时触发 */ 42 void timerTimeOut(); 43 44 /* 显示本机信息 */ 45 void showHostInfo(); 46 47 /* 启动定时器 */ 48 void timerStart(); 49 50 /* 清空 textBrowser 的信息 */ 51 void clearHostInfo(); 52 }; 53 #endif // MAINWINDOW_H 54 

头文件里主要是声明两个按钮和一个文本浏览框。另外还有一个定时器,声明一些槽函数,
比较简单。

在源文件“mainwindow.cpp”具体代码如下。

mainwindow.cpp 编程后的代码

 /****************************************************************** Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved. * @projectName 07_networkhostinfo * @brief mainwindow.cpp * @author Deng Zhimao * @email 1252699831@qq.com * @net www.openedv.com * @date 2021-04-10 *******************************************************************/ 1 #include "mainwindow.h" 2 #include  3 #include  4 #include  5 #include  6 7 MainWindow::MainWindow(QWidget *parent) 8 : QMainWindow(parent) 9 { 10 /* 设置位置与大小 */ 11 this->setGeometry(0, 0, 800, 480); 12 13 /* 点击获取本地信息按钮和清空文本按钮 */ 14 pushButton[0] = new QPushButton(); 15 pushButton[1] = new QPushButton(); 16 17 pushButton[0]->setText("获取本机信息"); 18 pushButton[1]->setText("清空文本信息"); 19 20 /* 按钮的大小根据文本自适应, 
21 * 注意 setSizePolicy 需要在布局中使用 */ 22 pushButton[0]->setSizePolicy(QSizePolicy::Fixed, 23 QSizePolicy::Fixed); 24 pushButton[1]->setSizePolicy(QSizePolicy::Fixed, 25 QSizePolicy::Fixed); 26 27 /* 水平 Widget 和垂直 Widget 用于添加布局 */ 28 hWidget = new QWidget(); 29 vWidget = new QWidget(); 30 31 /* 水平布局和垂直布局 */ 32 hBoxLayout = new QHBoxLayout(); 33 vBoxLayout = new QVBoxLayout(); 34 35 /* 文本浏览框 */ 36 textBrowser = new QTextBrowser(); 37 38 /* 添加到水平布局 */ 39 hBoxLayout->addWidget(pushButton[0]); 40 hBoxLayout->addWidget(pushButton[1]); 41 42 /* 将水平布局设置为 hWidget 的布局 */ 43 hWidget->setLayout(hBoxLayout); 44 45 /* 将文本浏览框和 hWidget 添加到垂直布局 */ 46 vBoxLayout->addWidget(textBrowser); 47 vBoxLayout->addWidget(hWidget); 48 49 /* 将垂直布局设置为 vWidget 的布局 */ 50 vWidget->setLayout(vBoxLayout); 51 52 /* 设置 vWidget 为中心部件 */ 53 setCentralWidget(vWidget); 54 55 /* 定时器初始化 */ 56 timer = new QTimer(); 57 58 /* 信号槽连接 */ 59 connect(pushButton[0], SIGNAL(clicked()), 60 this, SLOT(timerStart())); 61 connect(pushButton[1], SIGNAL(clicked()), 62 this, SLOT(clearHostInfo())); 63 connect(timer, SIGNAL(timeout()), 64 this, SLOT(timerTimeOut())); 65 } 66 67 MainWindow::~MainWindow() 68 { 69 } 70 71 72 void MainWindow::timerStart() 73 { 74 /* 清空文本 */ 75 textBrowser->clear(); 76 77 /* 定时 1s */ 78 timer->start(1000); 79 } 80 81 void MainWindow::timerTimeOut() 82 { 83 /* 显示本机信息 */ 84 showHostInfo(); 85 86 /* 停止定时器 */ 87 timer->stop(); 88 } 89 90 QString MainWindow::getHostInfo() 91 { 92 /* 通过 QHostInfo 的 localHostName 函数获取主机名称 */ 93 QString str = "主机名称:" + QHostInfo::localHostName() + "\n"; 94 95 /* 获取所有的网络接口, 
96 * QNetworkInterface 类提供主机的 IP 地址和网络接口的列表 */ 97 QList list 98 = QNetworkInterface::allInterfaces(); 99 100 /* 遍历 list */ 101 foreach (QNetworkInterface interface, list) { 102 str+= "网卡设备:" + interface.name() + "\n"; 103 str+= "MAC 地址:" + interface.hardwareAddress() + "\n"; 104 105 /* QNetworkAddressEntry 类存储 IP 地址子网掩码和广播地址 */ 106 QList entryList 107 = interface.addressEntries(); 108 109 /* 遍历 entryList */ 110 foreach (QNetworkAddressEntry entry, entryList) { 111 /* 过滤 IPv6 地址,只留下 IPv4 */ 112 if (entry.ip().protocol() == 113 QAbstractSocket::IPv4Protocol) { 114 str+= "IP 地址:" + entry.ip().toString() + "\n"; 115 str+= "子网掩码:" + entry.netmask().toString() + "\n"; 116 str+= "广播地址:" + entry.broadcast().toString() + "\n\n"; 117 } 118 } 119 } 120 121 /* 返回网络信息 */ 122 return str; 123 } 124 125 void MainWindow::showHostInfo() 126 { 127 /* 获取本机信息后显示到 textBrowser */ 128 textBrowser->insertPlainText(getHostInfo()); 129 } 130 131 void MainWindow::clearHostInfo() 132 { 133 /* 判断 textBrowser 是否为空,如果不为空则清空文本 */ 134 if (!textBrowser->toPlainText().isEmpty()) 135 136 /* 清空文本 */ 137 textBrowser->clear(); 138 } 

第 90~123 行,是本例最重要的代码。
第 93 行,通过 QHostInfo 的 localHostName 函数获取主机名称。
第 97~98 行,通过 QNetworkInterface::allInterfaces()获取网络接口列表 list 类存储 IP 地址子
网掩码和广播地址。如果我们用 qDebug()函数打印出 list,可以发现获取了所有的网络信息。
而我们要提取网络里面的网络信息使用 QNetworkAddressEntry。
第 106~107 行,使用 QNetworkAddressEntry 从 interface 接口里使用函数 addressEntries(),
获取所有的条目。就可以使用 QNetworkAddressEntry 的对象 entry 获取 IP 地址子网掩码和广播
地址。

第 110~118 行,因为获取的 entries 在一个 QNetworkInterface 下可能有两个 IP,分别是 ipv4

和 ipv6。这里使用 ip().protocol()来判断协议的类型,只留下 ipv4 类型的信息。筛选信息在我们
写程序常常需要的。

11.1.2 程序运行效果

点击获取本机信息,在文本浏览框内就打印出本机的网络信息(包括了主机名,网卡名,

ip 地址等)。这里因为过滤掉了 IPv6 的信息。通常一个网卡有两个 ip 地址,一个是 ipv4,另一
个是 ipv6 的地址。下面的网卡设备 lo,是本地回环网卡。另一个 ens33 是虚拟机的网卡,由

VMware 虚拟出来的。点击清空文本信息会清空文本浏览框里的网络信息。

在这里插入图片描述

相关内容

热门资讯

王凤英入职小鹏3年终获股权,此... 5月7日消息,小鹏汽车披露的监管及年报信息显示,公司总裁王凤英已正式进入股东名册,入职小鹏3年后股权...
五块钱红酒卖断货,便宜红酒为何... 最近一段时间,中国的酒类消费市场可以说是显得格外奇怪,一方面,各种高端酒特别是白酒的消费量出现了明显...
财联社C50风向指数调查:4月... 财联社5月8日讯(记者 夏淑媛)新一期财联社“C50风向指数”结果显示,市场机构对4月新增人民币贷款...
央视硬刚国际足联拒掏20亿,背... 作者| 史大郎&猫哥 来源| 是史大郎&大猫财经Pro 央视这次太刚了,离世界杯开幕还有1个月,死活...
新CEO上任直接放大招!Air... 快科技5月8日消息,苹果即将上任的CEO John Ternus对未来一系列新产品充满信心,称这些设...
“特朗普拟邀英伟达、波音等CE... 据路透社当地时间5月7日报道,特朗普政府正邀请英伟达、苹果、埃克森美孚、波音等大公司首席执行官,于下...
世界杯,还能看到直播吗? 2026年美加墨世界杯距离开幕,仅剩一个多月时间。多方信息显示,中央广播电视总台(以下简称“央视”)...
机构警告AI芯片热潮风险,超威... 5月7日,据央视财经,隔夜超威半导体公司(AMD)股价飙升近19%,带动AI芯片热潮持续升温。AMD...
银行员工转走储户1800万最新... 银行员工转走储户1800万最新进展:2名储户已收到银行全部款项
原创 中... 1994年,安徽省的经济格局曾发生过一次戏剧性的转折。在那一年,一座名为安庆的城市,其国内生产总值(...
昆都仑区:政策“蓄力”消费焕新 “一台5000多元的空调,叠加‘国补’和商场的以旧换新活动,能优惠1000元左右,旧机还能免费上门拆...
乐悦置业竞得佛山顺德乐从镇一商... 观点网讯:5月6日,佛山市顺德区乐从镇一商业地块成功出让,由广东省乐悦置业有限公司竞得,乐从南区·邻...
原创 亦... 《爱情没有神话》这部剧,一开始的命运颇为多舛,经历了几次撤档的波折后,终于在观众面前亮相,但其首播的...
美联储34年最大分歧叠加油价飙... 美联储按预期维持利率不变,但内部出现34年来最严重分歧,叠加布油创2022年6月以来新高,美债遭抛售...
支付宝消费券回收后,资金是否支... 摘要: 支付宝消费券回收变现后,资金能否直接转入信用卡?本文解答到账方式的相关规则,帮助用户了解资金...
中医介绍5个化痰穴位!收藏这篇... 很多人忽略了“痰”的危害,觉得咳几下就没事,殊不知,肺里的痰长期堆积,只会一步步加重身体负担。 中医...
黄金平台“杰我睿”涉嫌经济犯罪... 红星资本局5月7日消息,深圳水贝知名金店“杰我睿”兑付困难事件有了新进展。日前,深圳市公安局罗湖分局...
多地出台购房新政促楼市升温 记... 今年的“五一”假期,伴随着多个城市楼市新政密集落地,在叠加市场信心持续修复的作用下,房地产市场热度持...
谁是五一“吸金王”?这5座城市... 来源:市场资讯 (来源:21城市观) 哪座城市成为“五一”假期的大赢家? 图源:摄图网 作者|赵晓...
“低招低裁”格局稳固劳动力市场... 智通财经APP获悉,美国上周初请失业金人数在经历前一周回落至近几十年来最低水平后出现小幅反弹,表明尽...