#QT(网络文件下载)

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 network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += 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.0

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

FORMS += \
    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_NAMESPACE

class 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

 

 

相关推荐

  1. qt 5.15.2 网络文件下载功能

    2024-03-17 05:06:04       58 阅读
  2. Qt下载http文件

    2024-03-17 05:06:04       64 阅读
  3. QT案例 使用QProcess调用Aria2.exe下载网络资源文件

    2024-03-17 05:06:04       32 阅读
  4. Linux下载网络文档

    2024-03-17 05:06:04       23 阅读
  5. Hutool工具网络文件下载文件压缩

    2024-03-17 05:06:04       32 阅读
  6. 网页文件合并下载成zip

    2024-03-17 05:06:04       67 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-17 05:06:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-17 05:06:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-17 05:06:04       87 阅读
  4. Python语言-面向对象

    2024-03-17 05:06:04       96 阅读

热门阅读

  1. Kafka-SSL笔记整理

    2024-03-17 05:06:04       41 阅读
  2. 安装 docker 和 jenkins

    2024-03-17 05:06:04       35 阅读
  3. 行走的机器人

    2024-03-17 05:06:04       39 阅读
  4. linux 查看日志包含***字符上下200行日志命令

    2024-03-17 05:06:04       44 阅读
  5. wsl-oraclelinux 固定ip

    2024-03-17 05:06:04       47 阅读
  6. 2024计算机二级6

    2024-03-17 05:06:04       44 阅读
  7. Invalid value type for attribute ‘factoryBeanObjectType‘

    2024-03-17 05:06:04       37 阅读
  8. 189: 素数判定(python)

    2024-03-17 05:06:04       40 阅读
  9. 2024.2.20 校招 实习 内推 面经

    2024-03-17 05:06:04       40 阅读
  10. HashMap常用方法

    2024-03-17 05:06:04       46 阅读
  11. C语言自学笔记19----结构体函数

    2024-03-17 05:06:04       41 阅读