您的位置:首页 > 理论基础 > 计算机网络

QT http练习——创建一个能够下载URL资源的UI程序,并保存到本地指定目录下

2016-11-04 18:01 465 查看
#include
#include "mainwindow.h"

int main(int argc, char *argv[])
{

QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();

}#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include

//①前置声明
class QFile;
class QNetworkReply;
class QNetworkAccessManager;

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT
public:

explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void startRequest(QUrl url);         //声明一个公有的响应函数接收URL

private slots:

//③声明槽

void httpFinished();
void httpReadyRead();
void updateDataProgress(qint64,qint64);
void on_pushButton_clicked();

private:

//②定义私有变量
QNetworkAccessManager *manager;
Ui::MainWindow *ui;
QNetworkReply *reply;
QUrl url;
QFile *file;
};

#endif // MAINWINDOW_H#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
#include
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
manager = new QNetworkAccessManager(this);  //创建一个网络管理实例manager
ui->progressBar->hide();   //隐藏进度条

}

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

void MainWindow::startRequest(QUrl url)
{
reply = manager->get(QNetworkRequest(url));
connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead()));
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateDataProgress(qint64,qint64)));
connect(reply,SIGNAL(finished()),this,SLOT(httpFinished()));
}

//下载完成,隐藏进度条,关闭文件
void MainWindow::httpFinished()
{
ui->progressBar->hide();
file->flush();
file->close();
reply->deleteLater();
reply=0;

delete file;
file=0;
}

//读取准备好,进行读取文件到file中
void MainWindow::httpReadyRead()
{
if(file) file->write(reply->readAll());
}

//下载过程中,激活进度条动态显示
void MainWindow::updateDataProgress(qint64 bytesRead, qint64 totalBytes)
{
ui->progressBar->setMaximum(totalBytes);
ui->progressBar->setValue(bytesRead);
}

void MainWindow::on_pushButton_clicked()
{
QDir *temp = new QDir;    //获取QDir的地址,不是复制一个QDir
//判断文件夹是否存在
bool exist = temp->exists("./download");
if(exist)
QMessageBox::warning(this,tr("creat folder"),tr("The folder is exist!"));
else {
bool ok = temp->mkdir("./download");    //当文件夹不存在时进行创建
if(ok)
QMessageBox::warning(this,tr("creat folder"),tr("Creat the folder successful"));
}
//从lineEdit获取URL地址
url = ui->lineEdit->text();
QFileInfo info=(url.path());
qDebug()<open(QIODevice::WriteOnly))
{
qDebug()<<"file open error";
delete file;
file=0;
return;
}
startRequest(url);                     //获取url
ui->progressBar->setValue(0);          //设置进度条值从0开始
ui->progressBar->show();               //显示进度条
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐