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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/24662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty使用和常用组件辨析

Netty 使用和常用组件 简述 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId <version>4.1.42.Final </version> <scope>compile</scope> </dependency> Netty 的优势 1 、 AP…

【小吉带你学Git】idea操作(2)_版本和分支的相关操作

&#x1f38a;专栏【Git】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;版本⭐首先创建一个项目⭐添加暂存区⭐提交本地库&#x1f33…

压力测试与测试工具jmeter的介绍

目录 一、性能指标 二、jmeter &#xff08;一&#xff09;JMeter 安装 &#xff08;二&#xff09;JMeter 压测示例 1、添加线程组 2、添加 HTTP 请求 3、添加监听器 4、启动压测&查看分析结果 &#xff08;三&#xff09;JMeter Address Already in use 错误解决 压力测…

yum出现Could not retrieve mirrorlist解决方法

Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/?release6&archi386&repoos error was 14: PYCURL ERROR 6 - “Couldn’t resolve host ‘mirrorlist.centos.org…

monaco,monaco-editor,monaco-editor-webpack-plugin,

Monaco "Monaco"是包含了Monaco Editor和Monaco Language Server两个项目的总称&#xff0c;而"Monaco Editor"是Monaco项目中的一个部分&#xff0c;它是一款基于Web技术的高性能代码编辑器。 Monaco Language Server是一个支持多种语言的语言服务器&am…

【web逆向】全报文加密及其登录流程的分析案例

aHR0cHM6Ly9oZWFsdGguZWxkZXIuY2NiLmNvbS9zaWduX2luLw 涉及加密库jsencrypt 定位加密点 先看加密的请求和响应&#xff1a; 全局搜索加密字段jsondata&#xff0c;这种非特定参数的一般一搜一个准&#xff0c;搜到就是断点。起初下的断点没停住&#xff0c;转而从调用栈单步…

HJ52 计算字符串的编辑距离

题目&#xff1a;HJ52 计算字符串的编辑距离 题解&#xff1a; 定义dp方程&#xff0c;dp[i][j] 表示字符串s1(1-i)&#xff0c;到字符串s2(1-j)的编辑距离&#xff1b; 如果s1[i] s2[j] 证明当前位置的字符相等&#xff0c;无需操作&#xff0c;即dp[i][j] dp[i-1][j-1]; …

K8S系列文章之 kubeasz部署K8S环境

自动化安装方式&#xff08;kubeasz&#xff09;* 生产环境推荐&#xff08;首次安装下载相关配置和安装包&#xff09;是基于Ansible实现的部署工具 简单介绍 每一具体k8s集群的详细配置参数文件 Ansible 任务配置文件 镜像安装包 安装部署步骤 前提 &#xff1a; 保证Ansib…

Python web实战之 Django 的模板语言详解

关键词&#xff1a; Python、web开发、Django、模板语言 概要 作为 Python Web 开发的框架之一&#xff0c;Django 提供了一套完整的 MVC 模式&#xff0c;其中的模板语言为开发者提供了强大的渲染和控制前端的能力。本文介绍 Django 的模板语言。 1. Django 模板语言入门 Dj…

npm发布包

1.npm 登录 在控制台输入命令 npm login 按提示输入用户名&#xff0c;密码&#xff0c;邮箱后登录 如果出现如下提示 需要将淘宝镜像源切换为npm源&#xff0c;删除或注释以下内容就行 2.发布 进入准备发布的代码的根目录下&#xff0c;输入命令 npm publish 3.删除已发…

PostgreSql pg_ctl 命令

一、概述 控制 PostgreSQL 服务的工具。 二、语法 --初始化数据库实例 pg_ctl init[db] [-D datadir] [-s] [-o initdb-options]--启动数据库实例 pg_ctl start [-D datadir] [-l filename] [-W] [-t seconds] [-s] [-o options] [-p path] [-c]--停止数据库实例 pg_ctl sto…

区块链和WEB3.0有哪些基础知识呢

区块链基础知识 常用区块链基础知识包括&#xff1a; &#xff08;1&#xff09;区块链概念&#xff1a;区块链是一种去中心化的分布式账本技术&#xff0c;它通过加密算法和共识机制保证了数据的安全性和不可篡改性。区块链中的每一个区块都包含了前一个区块的哈希值&#x…

怎么学习CSS相关技术知识? - 易智编译EaseEditing

学习CSS技术是前端开发中的重要一环&#xff0c;它用于控制网页的样式和布局&#xff0c;使网页更加美观和易于使用。以下是学习CSS技术的几个方面&#xff1a; 基本语法和选择器&#xff1a; 了解CSS的基本语法&#xff0c;学习如何使用选择器来选择HTML元素并应用样式。 样…

一条sql语句在mysql中如何执行(查询+更新)

文章目录 一 MySQL 基础架构1.1 MySQL 基本架构1.2 Server 层基本组件介绍1) 连接器2) 查询缓存(MySQL 8.0 版本后移除)3) 分析器4) 优化器5) 执行器 二 语句分析2.1 查询语句2.2 更新语句为什么要用两个日志模块&#xff0c;用一个日志模块不行吗?为什么必须有“两阶段提交”…

MySQL的索引使用的数据结构,事务知识

一、索引的数据结构&#x1f338; 索引的数据结构&#xff08;非常重要&#xff09; mysql的索引的数据结构&#xff0c;并非定式&#xff01;&#xff01;&#xff01;取决于MySQL使用哪个存储引擎 数据库这块组织数据使用的数据结构是在硬盘上的。我们平时写的代码是存在内存…

根据今天全量的数据以及昨天全量的数据,获取今天增量的数据

编写了一个根据今天的全量的数据以及昨天全量的数据&#xff0c;自动获取今天增量数据的脚本。 #!/bin/bashhive_db"" hive_result_tb"" hive_source_tb"" hive_source_last_tb"" hive_pk""initParam(){# 库名hive_db${1}# …

Qt中JSON的使用

一.前言&#xff1a; JSON是一种轻量级数据交换格式&#xff0c;常用于客户端和服务端的数据交互&#xff0c;不依赖于编程语言&#xff0c;在很多编程语言中都可以使用JSON&#xff0c;比如C&#xff0c;C&#xff0c;Java&#xff0c;Android&#xff0c;Qt。除了JSON&#x…

前端实现给图片添加水印

一、利用Canvas ::: tip 实现步骤: 上传图片&#xff0c;转换为base64格式的数据&#xff0c;利用Image加载图片利用canvas写入图片&#xff0c;然后绘制水印最后通过canvas输出添加水印后的base64数据 ::: 1. 本地读取图像文件渲染到img标签 ::: tip ​ 通过intpt[type…

格力变频空调怎么收氟?

格力变频空调怎么收氟&#xff1f; 随着气温的升高&#xff0c;越来越多的人开始使用格力变频空调来调节室内温度。但是&#xff0c;在使用格力变频空调时&#xff0c;很多人并不知道如何正确收氟。下面&#xff0c;我们将详细介绍一下格力变频空调怎么收氟。 首先&#xff0…

MyCat核心概念、需求案例讲解、环境准备及分片配置

1.MyCat概念介绍 2.MyCat入门需求 2.1 需求分析 2.2 环境准备 输入以下命令检查服务器防火墙状态 dead代表关闭状态&#xff0c;如果不关闭也可以需要开放特定的端口号&#xff01;&#xff01; systemctl status firewalld接着需要在三台服务器上的MySQL上创建三个数据库db0…