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

来源:互联网 发布:f999b隔墙听淘宝有卖吗 编辑:程序博客网 时间:2024/06/07 16:45

注意在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