#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

 

 

  • 31
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用QT实现FTP文件下载功能,你可以使用QNetworkAccessManager类。下面是一个使用QT的QNetworkAccessManager下载文件的示例代码: ``` QNetworkAccessManager *manager = new QNetworkAccessManager(this); QUrl url("ftp://example.com/path/to/file.txt"); QNetworkRequest request(url); QNetworkReply *reply = manager->get(request); connect(reply, &QNetworkReply::finished, [=]() { if(reply->error() == QNetworkReply::NoError) { QFile file("local/path/to/save/file.txt"); if(file.open(QIODevice::WriteOnly)) { file.write(reply->readAll()); file.close(); qDebug() << "File downloaded successfully!"; } } else { qDebug() << "Error: " << reply->errorString(); } reply->deleteLater(); }); ``` 请注意,你需要将"example.com/path/to/file.txt"替换为实际的FTP服务器地址和文件路径,将"local/path/to/save/file.txt"替换为你想要保存文件的本地路径。 这段代码首先创建了一个QNetworkAccessManager对象,并指定了要下载的文件的URL。然后,发送了一个GET请求,并连接了finished信号的槽函数。在槽函数中,我们首先检查是否有错误发生,如果没有错误,我们打开本地文件并将从网络回复中读取的数据写入到该文件中。最后,我们删除回复对象并输出相应的消息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [QT实现FTP下载文件功能](https://blog.csdn.net/zhangliangfeng412/article/details/121535580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Qt实现FTP下载](https://blog.csdn.net/qq_32348883/article/details/123162738)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值