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 虚拟出来的。点击清空文本信息会清空文本浏览框里的网络信息。

在这里插入图片描述

相关内容

热门资讯

美股迭创新高 高盛却 “泼冷水... 财联社7月23日讯(编辑 卞纯)随着投资者热情高涨,美股近期迭创新高。周二,虽然美股三大指数涨跌不一...
知名投资人段永平再发声,坚定看... 来源:茅台时空 据上海证券报报道,知名投资人段永平于7月19日在社交平台发声,再度表达对茅台的坚定信...
申报新三板挂牌17月未过审!利... 导读:重数传媒新三板挂牌申请的审核时长已明显大幅超越了同期申报企业,其第三次A股上市进程再度陷入缓慢...
天阳科技:公司服务于以银行为主... 证券之星消息,天阳科技(300872)07月22日在投资者关系平台上答复投资者关心的问题。 投资者提...
泰凯英IPO:北交所细分行业龙... 来源:挖贝网 据《北京证券交易所上市委员会2025年第15次审议会议公告》显示,北京证券交易所上市委...
太平洋证券研究院副院长刘国清离... 来源:市场资讯 来源:金融人事mini 今年初,原华金证券研究所所长孙远峰加盟太平洋证券担任总经理助...
AWS上海AI研究院解散 官方... DoNews7月23日消息,22日,AWS 亚马逊云科技上海 AI 研究院的首席应用科学家王敏捷发朋...
天弘2只光伏基金跌麻了!三年半... 作者 |郑理 各家公募二季度报告陆续揭开面纱,1.2万亿公募巨头天弘基金管理有限公司(下称“天弘基金...
连亏四年割肉券商,锦龙股份跨界... 手握两张券商牌照的锦龙股份(000712.SZ)正在寻求转型。 7月23日,锦龙股份公告称,公司与广...
悉尼华人区15位业主“合伙卖房... 《澳洲金融评论报》7月23日报道,家住悉尼华人区Carlingford的居民Mario Gabrae...
石破茂证实日美达成协议:美对日... 当地时间23日,日本首相石破茂在直播记者会上称,日本与美国就关税问题达成一致,美方将向日本征收15%...
资金大举净流入这类ETF 受基建、煤炭板块大涨影响,资金强势流入相关ETF,本周前两个交易日,建材ETF(516750)等吸引...
6.52万元/平米!绿城46.... 苏州住宅楼板价纪录再次被绿城中国(03900.HK)刷新。 7月23日,江苏省苏州市两宗住宅地块成功...
原创 3... 在股市,资金多还是少赚钱都难,小凡玩ETF只是不会踏空,那些玩股票的冷暖自知。 牛市第一阶段玩ETF...
GTC泽汇:美元承压与黄金资产... 年初以来,美元持续走弱,维持在多年低点附近,其贬值并非短期波动,而是长期趋势延续的结果。这一局面使得...
原创 从... 当“反内卷”政策遇上了万亿级别的雅下水电大规模投资政策,对周期行业来说,无疑迎来了重要性的发展机遇。...
A股又蹦迪!万亿成交藏玄机?内... 来源:倪卫涛 今天A股又把散户玩明白了:指数创新高,你怕得想割肉;刚卖完就拉升,回头一看大腿拍肿。内...
雅下水电概念横空出世!恒立钻具... 7月21日至23日,A股雅下水电概念连续大涨。 图源:图虫 其中,恒立钻具(836942.BJ)连...
多地市场监管部门约谈外卖平台,... 南都讯 记者李玲7月18日,市场监管总局开展行政约谈,要求饿了么、美团、京东进一步规范促销行为,理性...
原创 被... 雷达财经鸿途出品 文|姚柏臣 编|孟帅 7月18日晚,家居零售巨头美凯龙发布的一则公告引发行业关注:...