#QT(网络文件下载)

news/2024/4/28 6:36:07

1.IDE:QTCreator


2.实验:从网络上下载devc++

链接:http://crxzc.198424.com/dev-cpp_5.11_setup.zip


3.记录:

(1)主界面

(2)check box

 

(3)缺省路径的实现

void Widget::on_defaultpath_pb_clicked()     //缺省路径按钮按下时
{QString path="c:/Users/***/Desktop/music_path/";       // '/'后面接文件的名字,即为存放在music_path路径下面的文件ui->keeppath_text->setText(path);
}

(4)下载进度加载实现

void Widget::DownLoad_Progress(qint64 byteNow,qint64 byteTotal)  //下载进度
{ui->downloadprogress_bar->setMaximum(byteTotal);ui->downloadprogress_bar->setValue(byteNow);
}

(5)下载的实现

void Widget::Network_ReadyToDownload() //准备下载
{downloadfile->write(networkreply->readAll());   //把所有得到的响应数据写入downloadfile里面
}

(6)网络回应的实现

void Widget::Network_Reply()        //网络回应
{QFileInfo fileinfo;fileinfo.setFile(downloadfile->fileName());downloadfile->close();delete downloadfile;downloadfile=Q_NULLPTR;networkreply->deleteLater();networkreply=Q_NULLPTR;if(ui->openafterdownload_check->isChecked()){     //下载完成后打开勾选QDesktopServices::openUrl(QUrl::fromLocalFile(fileinfo.absolutePath()));ui->download_pb->setEnabled(true);}}

 (7)下载按钮按下时进行

void Widget::on_download_pb_clicked()      //下载按钮按下时
{QString url_text=ui->url_text->text().trimmed();   //trimmed可以去掉空格if(url_text.isEmpty())                            //先检验是否输入QMessageBox::information(this,"empty!","请输入网址");QUrl url=QUrl::fromUserInput(url_text);if(!url.isValid())      //检查网址是否无效{QMessageBox::information(this,"invalid url!",QString("无效的网址%1\n错误信息%2").arg(url_text,url.errorString()));  //打印错误信息return;}if(ui->keeppath_text->text().isEmpty())    //检查保存路径是否为空{QMessageBox::information(this,"路径错误","请输入路径");return;}QString keep_path=ui->keeppath_text->text().trimmed()+url.fileName();   //传入路径(组合)if(QFile::exists(keep_path))                 //判断路径是否存在QFile::remove(keep_path);downloadfile=new QFile(keep_path);if(!downloadfile->open(QIODevice::WriteOnly)){QMessageBox::information(this,"出错了","临时文件打开失败");return;}ui->download_pb->setDisabled(true);   //禁止再次点击下载(下载中)networkreply=networkaccessmanager.get(QNetworkRequest(url));   //获取网络请求回应connect(networkreply,SIGNAL(finished()),this,SLOT(Network_Reply()));   //获得网络回应connect(networkreply,SIGNAL(readyRead()),this,SLOT(Network_ReadyToDownload()));  //准备下载connect(networkreply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(DownLoad_Progress(qint64,qint64)));  //下载进度}

4.代码

pro

QT       += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++17# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QFile>
#include <QFileInfo>
#include <QDesktopServices>
#include <QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::Network_Reply()        //网络回应
{QFileInfo fileinfo;fileinfo.setFile(downloadfile->fileName());downloadfile->close();delete downloadfile;downloadfile=Q_NULLPTR;networkreply->deleteLater();networkreply=Q_NULLPTR;if(ui->openafterdownload_check->isChecked()){     //下载完成后打开勾选QDesktopServices::openUrl(QUrl::fromLocalFile(fileinfo.absolutePath()));ui->download_pb->setEnabled(true);}}
void Widget::Network_ReadyToDownload() //准备下载
{downloadfile->write(networkreply->readAll());   //把所有得到的响应数据写入downloadfile里面
}
void Widget::DownLoad_Progress(qint64 byteNow,qint64 byteTotal)  //下载进度
{ui->downloadprogress_bar->setMaximum(byteTotal);ui->downloadprogress_bar->setValue(byteNow);
}void Widget::on_defaultpath_pb_clicked()     //缺省路径按钮按下时
{QString path="c:/Users/***/Desktop/music_path/";       // '/'后面接文件的名字,即为存放在music_path路径下面的文件ui->keeppath_text->setText(path);
}void Widget::on_download_pb_clicked()      //下载按钮按下时
{QString url_text=ui->url_text->text().trimmed();   //trimmed可以去掉空格if(url_text.isEmpty())                            //先检验是否输入QMessageBox::information(this,"empty!","请输入网址");QUrl url=QUrl::fromUserInput(url_text);if(!url.isValid())      //检查网址是否无效{QMessageBox::information(this,"invalid url!",QString("无效的网址%1\n错误信息%2").arg(url_text,url.errorString()));  //打印错误信息return;}if(ui->keeppath_text->text().isEmpty())    //检查保存路径是否为空{QMessageBox::information(this,"路径错误","请输入路径");return;}QString keep_path=ui->keeppath_text->text().trimmed()+url.fileName();   //传入路径(组合)if(QFile::exists(keep_path))                 //判断路径是否存在QFile::remove(keep_path);downloadfile=new QFile(keep_path);if(!downloadfile->open(QIODevice::WriteOnly)){QMessageBox::information(this,"出错了","临时文件打开失败");return;}ui->download_pb->setDisabled(true);   //禁止再次点击下载(下载中)networkreply=networkaccessmanager.get(QNetworkRequest(url));   //获取网络请求回应connect(networkreply,SIGNAL(finished()),this,SLOT(Network_Reply()));   //获得网络回应connect(networkreply,SIGNAL(readyRead()),this,SLOT(Network_ReadyToDownload()));  //准备下载connect(networkreply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(DownLoad_Progress(qint64,qint64)));  //下载进度,注意信号是QT自带的函数,而槽是自己定义在头文件的}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QFile>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECT
private:                         //QNetworkAccessManager networkaccessmanager;QNetworkReply *networkreply;QFile *downloadfile;
private slots:void Network_Reply();        //网络回应void Network_ReadyToDownload(); //准备下载void DownLoad_Progress(qint64 byteNow,qint64 byteTotal);  //下载进度void on_defaultpath_pb_clicked();void on_download_pb_clicked();public:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H

 

 

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

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

相关文章

音视频实战---读取音视频文件的AAC音频保存成aac文件

1、使用avformat_open_input函数打开音视频文件 2、使用avformat_find_stream_info函数获取解码器信息。 3、使用av_dump_format设置打印信息 4、使用av_init_packet初始化AVPacket。 5、使用av_find_best_stream查找对应音视频流的流下标。 6、使用av_read_frame读取音视…

jenkins指定jdk版本打包和运行项目

背景&#xff1a;因为jdk8安装jenkins有很多插件有问题&#xff0c;导致很多自动化编译都有问题&#xff0c;所以我jenkins使用jdk11进行安装。全局变量配置了jdk11&#xff0c;直接一键式命令安装jdk8会导致jenkins异常。 1、第一步&#xff0c;去下载jdk8版本解压。下载地址&…

【STL】stack栈容器与list链表容器

目录 1.栈stack 2.list链表容器 1.栈stack 栈具有先进后出的特性&#xff0c;最先进入的数据压在最底下&#xff0c;最后出来 2.list链表容器 list链表容器是一种双向链表&#xff0c;两端都可插入与删除&#xff0c;是双向访问迭代器&#xff0c;与vertor随机访问迭代器有不…

Etcd 介绍与使用(入门篇)

etcd 介绍 etcd 简介 etc &#xff08;基于 Go 语言实现&#xff09;在 Linux 系统中是配置文件目录名&#xff1b;etcd 就是配置服务&#xff1b; etcd 诞生于 CoreOS 公司&#xff0c;最初用于解决集群管理系统中 os 升级时的分布式并发控制、配置文件的存储与分发等问题。基…

2024/3/14打卡k倍区间(8届蓝桥杯)——前缀和+优化***

题目 给定一个长度为 N 的数列&#xff0c;A1,A2,…AN&#xff0c;如果其中一段连续的子序列 Ai,Ai1,…Aj 之和是 K 的倍数&#xff0c;我们就称这个区间 [i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗&#xff1f; 输入格式 第一行包含两个整数 N 和 K。 以下 N…

适用于系统版本:CentOS 6/7/8的基线安全检测脚本

#!/bin/bash #适用于系统版本&#xff1a;CentOS 6/7/8 echo "----------------检测是否符合密码复杂度要求----------------" #把minlen&#xff08;密码最小长度&#xff09;设置为8-32位&#xff0c;把minclass&#xff08;至少包含小写字母、大写字母、数字、特殊…