QT—下载器的实现
对于软件的下载大家肯定会非常苦恼,因为你的下载通常伴随着各种各样的插件,让人烦躁。
今天教大家实现一个简单的下载器,运行如下图所示:
源代码下载
下载器中用到的主要有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); }
网页预览功能已经实现,下面实现下载功能
4,①在BrowseWeb.h中添加头文件以及类的前置声明
#include 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("
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); } /*------------------------------------------------------*/ 本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
