QT学习 最简单的 文件下载器

注意在pro的配置文件 引入

QT       += network
头文件 头文件主要声明一些方法和变量
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QtNetwork>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void startRequest(QUrl url); //请求链接

private slots:
       void on_pushButton_clicked();  //下载按钮的单击事件槽函数
       void httpFinished();  //完成下载后的处理
       void httpReadyRead();  //接收到数据时的处理
       void updateDataReadProgress(qint64,qint64); //更新进度条
private:
    Ui::MainWindow *ui;
        QNetworkAccessManager *manager;//请求网络的对象
        QNetworkReply *reply;//出来返回结果的对象
        QUrl url;   //存储网络地址
        QFile *file;  //文件指针
};

#endif // MAINWINDOW_H

界面是一个progressbar 和一个 lineedit

不展示


然后是主文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    manager = new QNetworkAccessManager(this);
    ui->progressBar->hide();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    url = ui->lineEdit->text();
   //获取在界面中输入的url地址,如: http://zz.onlinedown.net/down/laolafangkuaijin.rar
    QFileInfo info(url.path());
    QString fileName(info.fileName());
      //获取文件名
      if (fileName.isEmpty()) fileName = "index.html";
  //如果文件名为空,则使用“index.html”,
  //例如使用“http://www.yafeilinux.com”时,文件名就为空
      file = new QFile(fileName);

      if(!file->open(QIODevice::WriteOnly))
      {   //如果打开文件失败,则删除file,并使file指针为0,然后返回
          qDebug() << "file open error";
          delete file;
          file = 0;
          return;
      }
      startRequest(url);  //进行链接请求
      ui->progressBar->setValue(0);  //进度条的值设为0
      ui->progressBar->show();  //显示进度条
}
void MainWindow::startRequest(QUrl url)  //链接请求
{
    reply = manager->get(QNetworkRequest(url));
    /
    connect(reply,SIGNAL(finished()),this,SLOT(httpFinished()));//当reply执行完毕后激发httpFinished方法
    //下载完成后
    connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead()));//当读取replay准备ok后就调用httpReadyRead方法读取内容并写入文件
    //并且根据读取进度更新进度条
    connect(reply,SIGNAL(downloadProgress(qint64,qint64)),
            this,SLOT(updateDataReadProgress(qint64,qint64)));

}
void MainWindow::httpReadyRead()   //有可用数据
{
    if (file) file->write(reply->readAll());  //如果文件存在,则写入文件
}
void MainWindow::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
 {
    ui->progressBar->setMaximum(totalBytes); //最大值
    ui->progressBar->setValue(bytesRead);  //当前值
}
void MainWindow::httpFinished()  //完成下载
{
    ui->progressBar->hide();
    file->flush();
    file->close();
    reply->deleteLater();
    reply = 0;
    delete file;
    file = 0;
}


代码http://dl.vmall.com/c0eas3ijfn

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值