• 初识Qt文件下载


    1、新建一个Qt Gui应用,项目名称为http,基类选择为QMainWindow,类名设置为MainWindow。

    2、在http.pro文件中的QT  += core gui后添加 network,或者直接添加QT  += network。

    3、在mainwindow.ui文件中分别拖入label控件、lineEdit控件、pushButton控件以及progressBar控件,如下。

    4、在mainwindow.h头文件中添加以下代码,同时添加#include<QtNetwork>

     1 public:
     2     void startRequest(QUrl url);
     3 
     4 private:
     5     QNetworkReply *reply;
     6     QUrl url;//存储网络地址
     7     QFile *file;//文件指针
     8 
     9 private slots:
    10     void on_pushButton_clicked();
    11     void httpFinished();
    12     void httpReadyRead();
    13     void updateDataReadProgress(qint64, qint64);

    5、在mainwindow.cpp源文件的构造函数中添加代码

    1  ui->progressBar->hide();

    同时,在mainwindow.cpp源文件中添加以下函数代码

     1 void MainWindow::on_pushButton_clicked()
     2 {
     3     url = ui->lineEdit->text();
     4     QFileInfo info(url.path());
     5     QString fileName(info.fileName());
     6     if (fileName.isEmpty()) fileName = "index.html";
     7     file = new QFile(fileName);
     8     if(!file->open(QIODevice::WriteOnly))//打开成功返回true,否则返回false
     9     {
    10         qDebug() << "file open error";
    11         delete file;
    12         file = 0;
    13         return;
    14     }
    15     startRequest(url);
    16     ui->progressBar->setValue(0);
    17     ui->progressBar->show();
    18 }
    19 
    20 void MainWindow::startRequest(QUrl url)
    21 {
    22     QNetworkAccessManager *manager;
    23     manager = new QNetworkAccessManager(this);
    24     reply = manager->get(QNetworkRequest(url));
    25     connect(reply, SIGNAL(readyRead()), this, SLOT(httpReadyRead()));//readyRead()信号继承自QIODevice类,每当有新的数据可以读取时,都会发射该信号
    26     connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(updateDataReadProgress(qint64, qint64)));//每当网络请求的下载进度更新时都会发射downloadProgress()信号
    27     connect(reply, SIGNAL(finished()), this, SLOT(httpFinished()));//每当应答处理结束时,都会发射finished()信号
    28 }
    29 
    30 void MainWindow::httpReadyRead()
    31 {
    32     if (file)
    33         file->write(reply->readAll());//如果创建了文件,则读取返回的所有数据,然后写入到文件。
    34 }
    35 
    36 void MainWindow::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
    37 {
    38     ui->progressBar->setMaximum(totalBytes);
    39     ui->progressBar->setValue(bytesRead);
    40 }
    41 
    42 void MainWindow::httpFinished()
    43 {
    44     ui->progressBar->hide();
    45     file->flush(); //文件刷新
    46     file->close();//文件关闭
    47     reply->deleteLater();
    48     reply = 0;
    49     delete file;
    50     file = 0;
    51 }

    6、运行,输入文件下载地址,点击下载后界面显示如下

    7、文件自动下载到工程根目录下

  • 相关阅读:
    SVN合并时报错:Merge tracking not allowed with missing subtrees; try restoring these items
    The operation names in the portType match the method names in the SEI or Web service implementation class.
    原生java调用webservice的方法,不用生成客户端代码
    如何快速开发一个支持高效、高并发的分布式ID生成器
    分布式ID生成器解决方案
    高并发分布式系统中生成全局唯一Id汇总
    python接口自动化17-multipart/form-data表单提交
    httprunner学习25-文件上传multipart/form-data
    python测试开发django-72.删除表后如何重新生成表
    python测试开发django-71.自定义标签tag
  • 原文地址:https://www.cnblogs.com/peter-czhang/p/3388410.html
Copyright © 2020-2023  润新知