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