对于软件的下载大家肯定会非常苦恼,因为你的下载通常伴随着各种各样的插件,让人烦躁。

     今天教大家实现一个简单的下载器,运行如下图所示:

            

qt集成sqlite QT集成aria2c制作极速下载器_进度条

                                                                                                                                                                                     源代码下载

下载器中用到的主要有QtNetwork类中的

QNetworkRequest//网络请求


QNetworkAccessManager//协调网络操作,允许应用程序发送网络请求和接收网络应答


QNetworkReply//网络应答


具体知识在代码中详细说明




1, 新建工程BrowseWeb,在项目文件BrowseWeb.pro中添加QT += network(可以在QT中使用网络模块)


2,在UI界面实现如上图所示控件。


3,①首先实现网页预览功能。在BrowseWeb.h添加类的前置声明


classQNetworkReply;


classQNetworkAccessManager;


②在类的私有成员中添加


QNetworkAccessManager*manager;




③添加私有槽函数


          privateslots:


          voidReplyFinished(QNetworkReply*);




在构造函数中定义一个QNetworkAccessManager类的对象,


用来发送网络请求和接收网络应答,


同时关联管理器的finish()信号和自定义槽。(每当网络应答结束后都会发射该信号)


manager=newQNetworkAccessManager(this);


connect(manager,SIGNAL(finished(QNetworkReply*)),


this,SLOT(ReplyFinished(QNetworkReply*)));


⑤添加私有槽的定义


voidBrowseWeb::ReplyFinished(QNetworkReply*reply)


{


QStringall=reply->readAll();//使用readAll读取所有的应答数据


ui->textBrowser->setText(all);


reply->deleteLater();


}


⑥Button槽的实现


void BrowseWeb::on_pushButton_clicked()
{
QString qurl = ui->lineEdit->text();//获取输入的url地址
if(ui->lineEdit->text() != "")



{
manager->get(QNetworkRequest(QUrl(qurl)));//发出请求
}
else
{
QMessageBox::warning(this,QString::fromLocal8Bit("警告对话框"),
QString::fromLocal8Bit("请输入Url地址"),QMessageBox::Abort);
}


        

网页预览功能已经实现,下面实现下载功能


BrowseWeb.h中添加头文件以及类的前置声明  


#include <QUrl>




class QFile;


       ②添加私有槽    


void httpReadyRead();//http准备读取数据
void updateDataReadProgress(qint64,qint64);//更新进度条
void httpFinished();//http完成


      ③添加一个公有成员

void startRequest(QUrl url);//开始请求
void imgPathToHtml(QString &path);//设置widget背景图片


      ④添加私有数据成员

QNetworkReply *reply;
QUrl url;
QFile *file;


     ⑤在构造函数中添加

/*-------------------widget背景--------------------*/
this->setAutoFillBackground(true);
QPalette palette;
palette.setBrush(QPalette::Background,QBrush(QPixmap(":/image/image/back.jpg")));//资源文件夹目录
this->setPalette(palette);
/*------------------------------------------------*/




ui->progressBar->hide();//在刚开始无需要下载的时候隐藏进度条


    ⑥实现函数的定义

void BrowseWeb::startRequest(QUrl url)//开始请求
{
reply = manager->get(QNetworkRequest(url));




//每当有新的数据可以读取的时都会发送readyRead()信号
connect(reply,SIGNAL(readyRead()),
this,SLOT(httpReadyRead()));
//每当网络请求的下载进度更新时都会发送downloadProgress()信号
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),
this,SLOT(updateDataReadProgress(qint64,qint64)));
//每当应答处理结束时都会发送finished()信号
connect(reply,SIGNAL(finished()),
this,SLOT(httpFinished()));
}
void BrowseWeb::httpReadyRead()
{
//判断是否创建了文件,是的话将读回来的数据写入到文件中
if(file)
file->write(reply->readAll());
}




void BrowseWeb::httpReadyRead()
{
//判断是否创建了文件,是的话将读回来的数据写入到文件中
if(file)
file->write(reply->readAll());
}




void BrowseWeb::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
{
//设置最大值和当前值
ui->progressBar->setMaximum(totalBytes);
ui->progressBar->setValue(bytesRead);
}




void BrowseWeb::httpFinished()
{
//完成下载后将进度条隐藏,将缓冲数据刷新到文件中,
//然后删除掉file和reply的对象
ui->progressBar->hide();
file->flush();
file->close();
reply->deleteLater();
reply = 0;
delete file;
file = 0;
}




void BrowseWeb::on_pushButton_2_clicked()//下载按钮
{
url = ui->lineEdit->text();
QFileInfo info(url.path());
QString fileName(info.fileName());
file = new QFile(fileName);




if(!file->open(QIODevice::WriteOnly))
{
qDebug()<<"file open error!";
delete file;
file = 0;
return;
}
startRequest(url);
ui->progressBar->setValue(0);
ui->progressBar->show();
}




void BrowseWeb::imgPathToHtml(QString &path)//设置背景图片
{
path = QString("<img src=\"%1\"/>").arg(path);
}




/*---------------------推荐下载实现-----------------------*/
void BrowseWeb::on_pushButton_qq_clicked()
{
ui->textBrowser->clear();
ui->lineEdit->setText("http://dldir1.qq.com/qqfile/qq/QQ8.9.1/20453/QQ8.9.1.exe");
QString imgPath = QString(":/image/image/qq.jpg");
imgPathToHtml(imgPath);
ui->textBrowser->insertHtml(imgPath);
}




void BrowseWeb::on_pushButton_360_clicked()
{
ui->textBrowser->clear();
ui->lineEdit->setText("http://221.204.7.214/softdl.360tpcdn.com/se8/360se8.1.1.248.exe");
QString imgPath = QString(":/image/image/360.jpg");
imgPathToHtml(imgPath);
ui->textBrowser->insertHtml(imgPath);
}




void BrowseWeb::on_pushButton_aqy_clicked()
{
ui->textBrowser->clear();
ui->lineEdit->setText("http://221.204.7.210/softdl.360tpcdn.com/QIYImedia/QIYImedia_5.5.33.3550_opensoft_1221.exe");
QString imgPath = QString(":/image/image/aqy.jpg");
imgPathToHtml(imgPath);
ui->textBrowser->insertHtml(imgPath);
}




void BrowseWeb::on_pushButton_wps_clicked()
{
ui->textBrowser->clear();
ui->lineEdit->setText("http://221.204.197.13/big.softdl.360tpcdn.com/WPSOffice/WPSOffice_10.1.0.6260_opensoft.exe");
QString imgPath = QString(":/image/image/wps.jpg");
imgPathToHtml(imgPath);
ui->textBrowser->insertHtml(imgPath);
}
/*------------------------------------------------------*/