QT网络(四):HTTP通信

Qt 网络模块提供一些类来实现 OSI 七层网络模型中高层的网络协议,如 HTTP、FTP、SNMP 等,这些类主要是 QNetworkRequest、QNetworkAccessManager 和 QNetworkReply。QNetworkRequest 类

通过 URL 发起网络协议请求,其也保存网络请求的信息,目前支持 HTTP、 FTP 和本地文件 URL 的下载或上传。

QNetworkAccessManager 类

用于协调网络操作,在 QNetworkRequest 发起网络请求后, QNetworkAccessManager 负责发送网络请求,以及创建网络响应。

QNetworkReply 类

表示网络请求的响应,由 QNetworkAccessManager 在发送网络请求后创建网 络响应。QNetworkReply 提供的信号 finished()、readyRead()、downloadProgress()可用于监测网络响应的执行情况,从而进行相应的操作。

QNetworkReply 继承了QIODevice,因此也支持流数据读写功能。

HTTP网络文件下载示例

URL 里的 HTTP 地址可以表示 为任何类型的文件,如 html 文件、pdf 文件、doc 文件、exe 文件等。

主窗口头文件如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include    <QMainWindow>
#include    <QNetworkAccessManager>
#include    <QNetworkReply>
#include    <QFile>
#include    <QUrl>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    QNetworkAccessManager networkManager;   //网络管理
    QNetworkReply *reply;   //网络响应
    QFile *downloadedFile;  //下载保存的临时文件
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    //自定义槽函数
    void do_finished();
    void do_readyRead();
    void do_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

在构造函数中设置UI后无须其他初始化设置

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->editURL->setClearButtonEnabled(true);
}

设置默认下载保存路径

void MainWindow::on_btnDefaultPath_clicked()
{//"默认路径"  按钮
    QString  curPath=QDir::currentPath();
    QDir    dir(curPath);
    QString  sub="temp";
    dir.mkdir(sub);    //创建一个临时文件夹
    ui->editPath->setText(curPath+"/"+sub+"/");
}

在输入有效的URL后点击下载对应的槽函数如下:

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())    //检查有效性
    {
        QString info="无效URL:"+urlSpec+"\n错误信息:"+newUrl.errorString();
        QMessageBox::information(this, "错误",info);
        return;
    }
    QString tempDir =ui->editPath->text().trimmed();    //临时目录
    if (tempDir.isEmpty())   //检查路径
    {
        QMessageBox::information(this, "错误", "请指定保存下载文件的目录");
        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, "错误","临时文件打开错误");
        return;
    }

    ui->btnDownload->setEnabled(false);
    //发送网络请求,创建网络响应
    reply = networkManager.get(QNetworkRequest(newUrl));
    //读取下载数据:在缓冲区有新下载的数据等待读取时,QNetworkReply 会发射 readyRead()信号
    connect(reply, SIGNAL(readyRead()), this, SLOT(do_readyRead()));
    //获取下载进度:传递 bytesRead 和 totalBytes 两个参数,表示已读取字节数和总的字节数
    connect(reply, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(do_downloadProgress(qint64,qint64)));
    //网络响应结束:信号 finished()在下载结束后被发射
    connect(reply, SIGNAL(finished()), this, SLOT(do_finished()));
}

1、首先读取URL文本框中的字符串,并判断是否为空,不为空再将该字符串使用QUrl::fromUserInput转为QUrl 类型变量,并检查URL的有效性。

2、检查下载保存的目录是否有效,trimmed()函数用于移除字符串两端的空白字符,如空格、制表符、换行符等

3、使用QUrl::fileName()获取下载连接中的文件名,并创建QFile临时文件用于暂存下载数据。

4、完成以上步骤后使用QNetworkAccessManager 对象发布网络请求,请求下载 URL 表示的文件, 并创建网络响应。

在缓冲区有新下载的数据等待读取时,QNetworkReply 会发射 readyRead()信号;信号 downloadProgress()表示网络操作进度,传递 bytesRead 和 totalBytes 两个参数,表示已读取字节数和总的字节数;信号 finished()在下载结束后被发射,通常再这个函数中关闭并删除临时文件指针对象,删除网络响应对象。

最后用静态函数 QDesktopServices::openUrl()调用默认的应用软件打开下载的文件,例如下载的是一个 PDF 文件,会自动用系统的默认软件打开此文件。

void MainWindow::do_readyRead()
{//读取下载的数据
    downloadedFile->write(reply->readAll());
}

void MainWindow::do_downloadProgress(qint64 bytesRead, qint64 totalBytes)
{//下载进度
    ui->progressBar->setMaximum(totalBytes);
    ui->progressBar->setValue(bytesRead);
}

void MainWindow::do_finished()
{//网络响应结束
    QFileInfo fileInfo(downloadedFile->fileName());   //为了获取下载后的文件名

    downloadedFile->close();
    delete downloadedFile;   //删除临时文件对象
    reply->deleteLater(); //由主事件循环删除此对象

    if (ui->chkBoxOpen->isChecked())    //打开下载的文件
        QDesktopServices::openUrl(QUrl::fromLocalFile(fileInfo.absoluteFilePath()));
    ui->btnDownload->setEnabled(true);
}

参考

QT6 C++开发指南

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch | 从零构建Vgg对CIFAR10进行分类

Pytorch | 从零构建Vgg对CIFAR10进行分类 CIFAR10数据集Vgg网络结构特点性能应用影响 Vgg结构代码详解结构代码代码详解特征提取层 _make_layers前向传播 forward 训练过程和测试结果代码汇总vgg.pytrain.pytest.py 前面文章我们构建了AlexNet对CIFAR10进行分类&#xff1a; Py…

将4G太阳能无线监控的视频接入电子监控大屏,要考虑哪些方面?

随着科技的飞速发展&#xff0c;4G太阳能无线监控系统以其独特的优势在远程监控领域脱颖而出。这种系统结合了太阳能供电的环保特性和4G无线传输的便捷性&#xff0c;为各种环境尤其是无电或电网不稳定的地区提供了一种高效、可靠的视频监控解决方案。将这些视频流接入大屏显示…

ASP.NET |日常开发中连接Mysql数据库增删改查详解

ASP.NET &#xff5c;日常开发中连接Mysql数据库增删改查详解 前言一、连接 MySQL 数据库1.1 安装和引用相关库1.2 建立数据库连接 二、数据库增删改查操作2.1 插入数据&#xff08;Insert&#xff09;2.2 查询数据&#xff08;Select&#xff09;2.3 更新数据&#xff08;Upda…

Go框架比较:goframe、beego、iris和gin

由于工作需要&#xff0c;这些年来也接触了不少的开发框架&#xff0c;Golang的开发框架比较多&#xff0c;不过基本都是Web"框架"为主。这里稍微打了个引号&#xff0c;因为大部分"框架"从设计和功能定位上来讲&#xff0c;充其量都只能算是一个组件&…

LLaMA-Factory 单卡3080*2 deepspeed zero3 微调Qwen2.5-7B-Instruct

环境安装 git clone https://gitcode.com/gh_mirrors/ll/LLaMA-Factory.git 下载模型 pip install modelscope modelscope download --model Qwen/Qwen2.5-7B-Instruct --local_dir /root/autodl-tmp/models/Qwen/Qwen2.5-7B-Instruct 微调 llamafactory-cli train \--st…

华为ensp--BGP路径选择-AS_Path

学习新思想&#xff0c;争做新青年&#xff0c;今天学习的是BGP路径选择-AS_Path 实验目的: 理解AS_Path属性的概念 理解通过AS_Path属性进行选路的机制 掌握修改AS_Path属性的方法 实验内容: 本实验模拟了一个运营商网络场景&#xff0c;所有路由器都运行BGP协议&#xff…

泛微OA定时任务的设置

泛微OA定时任务 背景 在日常流程开发中&#xff0c;是需要和别的系统进行连接的&#xff0c;比如OA和SAP之间的数据传输。 SAP涉及到的业务数据在生成之后&#xff0c;需要在OA生成对应的流程进行信息的审核&#xff0c;但是毕竟是两个不同的系统&#xff0c;所以数据同步是需…

【Harmony Next】多个图文配合解释DevEco Studio工程中,如何配置App相关内容,一次解决多个问题?

解决App配置相关问题列表 1、Harmony Next如何配置图标&#xff1f; 2、Harmony Next如何配置App名称&#xff1f; 3、Harmony Next如何配置版本号&#xff1f; 4、Harmony Next如何配置Bundle ID? 5、Harmony Next如何配置build号&#xff1f; 6、Harmony Next多语言配置在哪…

如何从0构建一个flask项目,直接上实操!!!

项目结构 首先&#xff0c;创建一个项目目录&#xff0c;结构如下&#xff1a; flask_app/ │ ├── app.py # Flask 应用代码 ├── static/ # 存放静态文件&#xff08;如CSS、JS、图片等&#xff09; │ └── style.css # 示例…

计算机网络B重修班-期末复习

[TOC] (计算机网络B重修班-期末复习&#xff09; 一、单选 &#xff08;20题&#xff0c;1分/题&#xff0c;共20分&#xff09; 二、判断 &#xff08;10题&#xff0c;1分/题&#xff0c;共10分&#xff09; 三、填空 &#xff08;10题&#xff0c;1分/题&#xff0c;共10…

js日期时区问题

东八区与0时区 东八区 我们所在地域使用的是 东八区 时区&#xff0c;所以平常使用的电脑设置的多是东八时区 js获取的时间格式 0时区 0时区 也叫 协调世界时 js获取的时间格式 数据库读取时间数据 平常从数据读取的时间默认是0时区的&#xff0c;成以下格式&#xff1a; 2024…

Ubantu22系统安装Miniconda3

1、Anaconda和Miniconda异同 清华源镜像的Miniconda3和Anaconda都是用于管理Python环境和软件包的工具&#xff0c;但它们之间存在一些关键的不同之处。下面将分别介绍它们的特点以及使用清华源镜像的差异。 相同点&#xff1a; &#xff08;1&#xff09;功能相似&#xff1a…

锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测,附锂电池最新文章汇集

锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测&#xff0c;附锂电池最新文章汇集 目录 锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测&#xff0c;附锂电池最新文章汇集预测效果基本描述程序设计参考资料 预测效果 基本描述 锂电池SOH预测 | 基于Bi…

安装opnet14.5遇到的问题

安装opnet遇到的问题 我是按照这个教程来安装的。 然后遇到了两个问题&#xff1a; 1、“mod_dirs”目录问题 Can’t enable ETS scripting support due to missing files。 This is likely because:<opnet_release_dir>\sys\lib is notinclude in the “mod_dirs” pre…

以腾讯混元模型为例,在管理平台上集成一个智能助手

背景 前几天&#xff0c;公司的同事们一起吃了个饭&#xff0c;餐桌上大家聊到大模型的落地场景。我个人在去年已经利用百度千帆平台写过案例&#xff0c;并发过博客&#xff08;传送门&#x1f449;&#xff1a;利用文心千帆打造一个属于自己的小师爷&#xff09;&#xff0c…

软件实验室认可|实验室比对的形式与方法

实验室比对是软件测试实验室在申请软件实验室认可必须要做的一类质量控制活动。实验室比对包括实验室间比对&#xff0c;和实验室内比对。实验室间比对指的是按照预先规定的条件&#xff0c;由两个或多个实验室对相同或类似的物品进行测量或检测的组织、实施和评价。实验室内比…

酷克数据携手江西移动入选“星河(Galaxy)”数据库潜力案例

2024 年 12 月 18 - 19 日&#xff0c;为推动打造行业交流平台&#xff0c;驱动产业创新共荣&#xff0c;大数据技术标准推进委员会以“数据重塑价值 智能链接未来”为主题&#xff0c;在北京召开为期两天的“2024 数据资产管理大会”。 在会上&#xff0c;第八届大数据“星河&…

【Verilog】UDP用户原语

User-defined primitives 概述基本语法组合逻辑的UDP时序逻辑的UDPUDP 符号表 Verilog HDL&#xff08;简称 Verilog &#xff09;是一种硬件描述语言&#xff0c;用于数字电路的系统设计。可对算法级、门级、开关级等多种抽象设计层次进行建模。 Verilog 不仅定义了语法&…

《Java核心技术I》Swing中滚动窗格

滚动窗格 Swing中文本区没有滚动条&#xff0c;如需要&#xff0c;可以将文本区放在 滚动窗格(scrollpane)中。 textArea new JTextArea(8,40); var scrollPane new JScrollPane(textArea); 添加到滚动窗格不是文本区特有的&#xff0c;所有组件都可以。 注释&#xff1a;JTe…

Node.js day-01

01.Node.js 讲解 什么是 Node.js&#xff0c;有什么用&#xff0c;为何能独立执行 JS 代码&#xff0c;演示安装和执行 JS 文件内代码 Node.js 是一个独立的 JavaScript 运行环境&#xff0c;能独立执行 JS 代码&#xff0c;因为这个特点&#xff0c;它可以用来编写服务器后端…