14-5_Qt 5.9 C++开发指南_基于HTTP 协议的网络应用程序
文章目录
- 1. 实现高层网络操作的类
- 2. 基于HTTP协议的网络文件下载
- 3.源码
- 3.1 可是化UI设计
- 3.2 mainwindow.h
- 3.3 mainwindow.cpp
1. 实现高层网络操作的类
Qt 网络模块提供一些类实现 OSI 7 层网络模型中高层的网络协议,如 HTTP、FTP、SNMP等,这些类主要是 QNetworkRequest、QNetworkReply和QNetworkAccessManager。
QNetworkRequest 类通过一个URL 地址发起网络协议请求,也保存网络请求的信息,目前支持 HTTP、FTP 和局部文件 URLs的下载或上传。
QNetworkAccessManager 类用于协调网络操作。在 QNetworkRequest 发起一个网络请求后,
QNetworkAccessManager 类负责发送网络请求,创建网络响应。
QNetworkReply 类表示网络请求的响应。由 QNetworkAccessManager 在发送一个网络请求后创建一个网络响应。QNetworkReply 提供的信号 finished()、readyRead()和 downloadProgress()可以监测网络响应的执行情况,执行相应操作。
QNetworkReply 是QIODevice 的子类,所以QNetworkReply 支持流读写功能,也支持异步或同步工作模式
2. 基于HTTP协议的网络文件下载
基于上述三个类,设计一个基于HTTP 协议的网络文件下载程序,实例程序名称 samp14_5,图 14-12 是程序运行下载文件时的界面。

在 URL 地址编辑框里输入一个网络文件 URL 地址,设置下载文件保存路径后,单击“下载按钮就可以开始下载文件到设置的目录下。进度条可以显示文件下载进度,下载完成后还可以用缺省的软件打开下载的文件。URL 里的 HTTP 地址可以是任何类型的文件,如 html、pdf、doc、exe 等。
实例 samp14_5主界面是基于 QMainWindow 的窗口类 MainWindow,使用 UI设计器设计界面,删除了主窗口上的工具栏和状态栏。MainWindow 类的定义如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QFile>
#include <QUrl>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECT
private:QNetworkAccessManager networkManager;//网络管理QNetworkReply *reply; //网络响应QFile *downloadedFile;//下载保存的临时文件
public:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:
//自定义槽函数void on_finished();void on_readyRead();void on_downloadProgress(qint64 bytesRead, qint64 totalBytes);
...private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H
要下载文件,先在窗口上的 URL编辑框里输入下载地址(可以使用 Ctrl+V 组合键粘贴URL地址),再设置下载文件保存的目录。单击“缺省路径”按钮会在程序的当前目录下创建一个临时文件夹,代码如下:
void MainWindow::on_btnDefaultPath_clicked()
{//缺省路径 按钮QString curPath=QDir::currentPath();QDir dir(curPath);QString sub="temp";dir.mkdir(sub);ui->editPath->setText(curPath+"/"+sub+"/");
}
输入这些设置后,单击“下载”按钮开始下载过程,“下载”按钮的响应代码如下:
void MainWindow::on_btnDownload_clicked()
{//开始下载 按钮QString urlSpec = ui->editURL->text().trimmed();if (urlSpec.isEmpty()){QMessageBox::information(this, "错误","请指定需要下载的URL");return;}QUrl newUrl = QUrl::fromUserInput(urlSpec);//URL地址if (!newUrl.isValid()){QMessageBox::information(this, "错误",QString("无效URL: %1 \n 错误信息: %2").arg(urlSpec, newUrl.errorString()));return;}QString tempDir =ui->editPath->text().trimmed();//临时目录if (tempDir.isEmpty()){QMessageBox::information(this, tr("错误"), "请指定保存下载文件的目录");return;}QString fullFileName =tempDir+newUrl.fileName(); //文件名if (QFile::exists(fullFileName))QFile::remove(fullFileName);downloadedFile =new QFile(fullFileName);//创建临时文件if (!downloadedFile->open(QIODevice::WriteOnly)){QMessageBox::information(this, tr("错误"),"临时文件打开错误");return;}ui->btnDownload->setEnabled(false);//发送玩过请求,创建网络响应reply = networkManager.get(QNetworkRequest(newUrl));connect(reply, SIGNAL(finished()), this, SLOT(on_finished()));connect(reply, SIGNAL(readyRead()), this, SLOT(on_readyRead()));connect(reply, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(on_downloadProgress(qint64,qint64)));
}
代码在读取 URL 地址后,将其转换为一个 QUrl 类变量 newUrl,并检查其有效性,再检查临时文件目录,创建临时文件 downloadedFile。
这些准备好之后,用QNetworkAccessManager 发布网络请求,请求下载URL 地址表示的文件,并创建网络响应,关键代码为:
reply = networkManager.get(QNetworkRequest(newUrl));
reply 为网络响应,将其 3 个信号与相关的自定义槽函数相关联,实现相应的操作。这3 个槽函数的代码如下:
void MainWindow::on_readyRead()
{//读取下载的数据downloadedFile->write(reply->readAll());
}void MainWindow::on_downloadProgress(qint64 bytesRead, qint64 totalBytes)
{//下载进程ui->progressBar->setMaximum(totalBytes);ui->progressBar->setValue(bytesRead);
}void MainWindow::on_finished()
{//网络响应结束QFileInfo fileInfo;fileInfo.setFile(downloadedFile->fileName());downloadedFile->close();delete downloadedFile;downloadedFile = Q_NULLPTR;reply->deleteLater(); //reply = Q_NULLPTR;if (ui->checkOpen->isChecked())//打开下载的文件QDesktopServices::openUrl(QUrl::fromLocalFile(fileInfo.absoluteFilePath()));ui->btnDownload->setEnabled(true);
}
在缓冲区有新下载的数据等待读取时,会发射 readyRead()信号,槽函数 on_readyRead()读取下载缓冲区的数据到临时文件。
downloadProgress()是表示网络操作进度的信号,传递 bytesRead 和 totalBytes 两个参数,表示已读取字节数和总的字节数;on_downloadProgress()槽函数将这两个参数用于进度条的显示,可以显示下载进度。
finished()信号在下载结束后发射,槽函数 on_finished()的功能是关闭临时文件,删除文件变量和网络响应变量。然后用 QDesktopServices:openUrl()函数调用缺省的应用软件打开下载的文件,例如,如果下载的是一个 PDF 文件,会自动用相关联的 PDF 阅读器软件打开此文件。
3.源码
3.1 可是化UI设计

3.2 mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QFile>
#include <QUrl>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECT
private:QNetworkAccessManager networkManager;//网络管理QNetworkReply *reply; //网络响应QFile *downloadedFile;//下载保存的临时文件
public:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:
//自定义槽函数void on_finished();void on_readyRead();void on_downloadProgress(qint64 bytesRead, qint64 totalBytes);void on_btnDefaultPath_clicked();void on_btnDownload_clicked();void on_editURL_textChanged(const QString &arg1);private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H
3.3 mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include <QMessageBox>
#include <QDesktopServices>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);ui->editURL->setClearButtonEnabled(true);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_finished()
{//网络响应结束QFileInfo fileInfo;fileInfo.setFile(downloadedFile->fileName());downloadedFile->close();delete downloadedFile;downloadedFile = Q_NULLPTR;reply->deleteLater(); //reply = Q_NULLPTR;if (ui->checkOpen->isChecked())//打开下载的文件QDesktopServices::openUrl(QUrl::fromLocalFile(fileInfo.absoluteFilePath()));ui->btnDownload->setEnabled(true);
}void MainWindow::on_readyRead()
{//读取下载的数据downloadedFile->write(reply->readAll());
}void MainWindow::on_downloadProgress(qint64 bytesRead, qint64 totalBytes)
{//下载进程ui->progressBar->setMaximum(totalBytes);ui->progressBar->setValue(bytesRead);
}void MainWindow::on_btnDefaultPath_clicked()
{//缺省路径 按钮QString curPath=QDir::currentPath();QDir dir(curPath);QString sub="temp";dir.mkdir(sub);ui->editPath->setText(curPath+"/"+sub+"/");
}void MainWindow::on_btnDownload_clicked()
{//开始下载 按钮QString urlSpec = ui->editURL->text().trimmed();if (urlSpec.isEmpty()){QMessageBox::information(this, "错误","请指定需要下载的URL");return;}QUrl newUrl = QUrl::fromUserInput(urlSpec);//URL地址if (!newUrl.isValid()){QMessageBox::information(this, "错误",QString("无效URL: %1 \n 错误信息: %2").arg(urlSpec, newUrl.errorString()));return;}QString tempDir =ui->editPath->text().trimmed();//临时目录if (tempDir.isEmpty()){QMessageBox::information(this, tr("错误"), "请指定保存下载文件的目录");return;}QString fullFileName =tempDir+newUrl.fileName(); //文件名if (QFile::exists(fullFileName))QFile::remove(fullFileName);downloadedFile =new QFile(fullFileName);//创建临时文件if (!downloadedFile->open(QIODevice::WriteOnly)){QMessageBox::information(this, tr("错误"),"临时文件打开错误");return;}ui->btnDownload->setEnabled(false);//发送玩过请求,创建网络响应reply = networkManager.get(QNetworkRequest(newUrl));connect(reply, SIGNAL(finished()), this, SLOT(on_finished()));connect(reply, SIGNAL(readyRead()), this, SLOT(on_readyRead()));connect(reply, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(on_downloadProgress(qint64,qint64)));
}void MainWindow::on_editURL_textChanged(const QString &arg1)
{Q_UNUSED(arg1);ui->progressBar->setMaximum(100);ui->progressBar->setValue(0);
}相关文章:
14-5_Qt 5.9 C++开发指南_基于HTTP 协议的网络应用程序
文章目录 1. 实现高层网络操作的类2. 基于HTTP协议的网络文件下载3.源码3.1 可是化UI设计3.2 mainwindow.h3.3 mainwindow.cpp 1. 实现高层网络操作的类 Qt 网络模块提供一些类实现 OSI 7 层网络模型中高层的网络协议,如 HTTP、FTP、SNMP等,这些类主要是…...
Kotlin委托
委托 委托 代理 方法内的成员永远拿不到thisRef:官方委托和自定义委托-》方法里面没办法使用反射 委托只能类委托和属性委托 Kotlin委托 本文链接:https://blog.csdn.net/feather_wch/article/details/132095759 类委托 1、类委托 委托的是接口的方…...
分布式协议与算法——CAP理论、ACID理论、BASE理论
CAP理论 CAP理论,对分布式系统的特性做了高度抽象,比如抽象成了一致性、可用性和分区容错性,并对特性间的冲突(也就是CAP不可能三角)做了总结。 CAP三指标 CAP理论对分布式系统的特性做了高度抽象,形成了…...
接口测试 Jmeter 接口测试 —— 请求 Headers 与传参方式
一、 背景: 在使用 Jmeter 进行接口测试时,有些小伙伴不知道 Headers 和请求参数 (Parameters,Body Data) 的联系,本文主要讲 Content-Type 为 application/x-www-form-urlencoded 和 application/json 的场景。 1、使用 Parame…...
【redis】redis部署1主2从3哨兵demo搭建示例
redis版本为7,搭建的架构为1主2从3哨兵的架构。本文是对搭建的过程做一个回忆,过程可能遗漏了某些步骤,见谅。 首先,需要有一个已经安装了的redis。我们从redis源码目录中,找到一个redis.conf文件,这个文件…...
C++数据结构之平衡二叉搜索树(一)——AVL的实现(zig-zag/左右双旋/3+4重构)
目录 00.BBST——平衡二叉搜索树01.AVL树02.AVL的插入2.1单旋——zig 与 zag2.2插入节点后的单旋实例2.3手玩小样例2.4双旋实例2.5小结 03.AVL的删除3.1单旋删除3.2双旋删除3.3小结 04.34重构05.综合评价AVL5.1优点5.2缺点 00.BBST——平衡二叉搜索树 本文是介绍众多平衡二叉搜…...
免疫疗法勘察兵——DC细胞
DC细胞又叫树状细胞或者树突细胞,1869年由保罗兰格尔翰斯发现,一开始被误以为是神经细胞的一种,直到1973年皮肤科医师Inga Silberberg发现了他的免疫功能,同年,被拉尔夫斯坦曼和赞威尔A科恩两人正式命名为“dendritic…...
Django实现音乐网站 ⑷
使用Python Django框架制作一个音乐网站,在系列文章3的基础上继续开发, 本篇主要是后台歌曲类型表、歌单表模块功能开发。 目录 表结构设计 歌曲类型表结构 歌单表结构 创建表模型 创建表 后台注册表模型 引入表模型 后台自定义 总结 表结构设计…...
2023年华数杯数学建模C题思路 - 母亲身心健康对婴儿成长的影响
# 1 赛题 C 题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一,她不仅为婴儿提供营养物质和身体保护, 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况,如抑郁、焦虑、 压力等,可能会对婴儿的认知、情…...
openGauss学习笔记-30 openGauss 高级数据管理-别名
文章目录 openGauss学习笔记-30 openGauss 高级数据管理-别名30.1 语法格式30.1.1 列别名语法30.1.2 表别名语法 30.2 参数说明30.3 示例 openGauss学习笔记-30 openGauss 高级数据管理-别名 SQL可以重命名一张表或者一个字段的名称,这个名称为该表或该字段的别名。…...
C#实现多线程局域网扫描器的思路与具体代码
C#实现多线程局域网扫描器的思路与具体代码 思路: 获取局域网内所有 IP 地址遍历所有 IP 地址,使用 Ping 命令测试主机是否在线如果主机在线,则扫描主机上的所有端口,确定哪些端口是开放的输出扫描结果 在上述过程中࿰…...
Redis秒杀:一人一单问题及初步解决
优惠券秒杀一人一单 前言一、需求以及之前存在的问题二、增加一人一单逻辑1.初步代码2.封装一人一单逻辑3.控制锁的粒度 三、事务控制问题四、总结 前言 跟随黑马虎哥学习redis: 这是我认为b站上最好的redis教程,各方面讲解透彻,知识点覆盖…...
python 数据分析面试题:求分组排第n名的记录数据
近期面试遇到一个面试题,分享给大家。 文中会提供详细的解题思路以及问题延伸 一、面试题 面试题:输出各学科总分第一名的学员姓名、年龄、分数数据: class_a {name: [学员1, 学员2, 学员3, 学员4,学员5],age: [23, 24, 26, 27,25],course…...
eclipse常用快捷键
Eclipse常用快捷键 补全代码的声明:alt /快速修复: ctrl 1批量导包:ctrl shift o使用单行注释:ctrl /使用多行注释: ctrl shift /取消多行注释:ctrl shift \复制指定行的代码:ctrl alt down 或…...
什么是OCR?OCR技术详解
光学字符识别(Optical Character Recognition)简称为“OCR”。ORC是指对包含文本资料的图像文件进行分析识别处理,获取文字及版面信息的技术。 一般包括以下几个过程: 1.图像输入 针对不同格式的图像,有着不同的存储格式和压缩方式。目前&…...
【大模型】开源且可商用的大模型通义千问-7B(Qwen-7B)来了
【大模型】开源且可商用的大模型通义千问-7B(Qwen-7B)来了 新闻通义千问 - 7B 介绍评测表现快速使用环境要求安装相关的依赖库推荐安装flash-attention来提高你的运行效率以及降低显存占用使用 Transformers 运行模型使用 ModelScope 运行模型 量化长文本…...
SQL分类及通用语法数据类型
一、SQL分类 DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)DML: 数据操作语言,用来对数据库表中的数据进行增删改DQL: 数据查询语言,用来查询数据库中表的记录DCL: 数据控制语言,用来创建数据库…...
亿欧智库:2023中国功效型护肤产品成分解析研究报告(附下载
关于报告的所有内容,公众【营销人星球】获取下载查看 核心观点 消费端:“纯净美妆〞概念火热,消费驱动因素向成分来源硬核转变 新冠疫情过后,消费者对于生活健康:自然,可持续的关注度持续上升。在消费者…...
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署(二)ETCD集群部署 Kubernetes高可用集群二进制部署(三)部署…...
python与深度学习(十二):CNN和猫狗大战二
目录 1. 说明2. 猫狗大战的CNN模型测试2.1 导入相关库2.2 加载模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章猫狗大战训练的模型进行测试。…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
