一、项目介绍二、项目基本配置三、UI界面设计四、主程序实现
4.0 pro文件4.1 dialog.h4.2 dialog.cpp 五、效果演示
一、项目介绍利用network相关类(QNetworkReply、QNetworkAccessManager)实现简单文件下载器功能。
二、项目基本配置新建一个Qt案例,项目名称为“DownloadTest”,基类选择“QDialog”,取消选中创建UI界面复选框,完成项目创建。
三、UI界面设计无UI界面
四、主程序实现 4.0 pro文件首先需要在两个pro文件中添加如下代码:
QT+=network4.1 dialog.h
头文件中声明私有变量和一些槽函数:
public: void startRequest(QUrl url); private: QLabel *Label; QLineEdit *TextLineEdit; QPushButton *DownLoadBtn; QVBoxLayout *mainLayout; QProgressBar *progressBar; QNetworkAccessManager *manager; QNetworkReply *reply; QUrl url; QFile *file; private slots: void httpFinished(); void httpReadyRead(); void updateDataReadProgress(qint64,qint64); void DownLoad();4.2 dialog.cpp
创建界面,设置相应布局:
setWindowTitle(tr("File Download")) ;//设置窗体的标题 //初始化各个控件 Label = new QLabel(tr("请输入URL地址:"),this); TextLineEdit= new QLineEdit(this); DownLoadBtn = new QPushButton(tr("下载"),this); progressBar =new QProgressBar(this); //设置布局 mainLayout= new QVBoxLayout(this); mainLayout->addWidget(Label); mainLayout->addWidget(TextLineEdit); mainLayout->addWidget(progressBar); mainLayout->addWidget(DownLoadBtn);
在没有下载文件时将进度条隐藏,连接按钮点击信号和对应的槽函数:
progressBar->hide();//没有下载文件时将进度条隐藏 manager = new QNetworkAccessManager(this);//创建QNetworkAccessManager实例,用来发送网络请求和接收应答 connect(DownLoadBtn,SIGNAL(clicked()),this, SLOT(DownLoad()));//点击下载按钮对应槽函数
定义按钮点击对应的槽函数:
void Dialog::DownLoad() { url = TextLineEdit->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);//开始网络请求 progressBar->setValue(0);//设置进度条初始值为0 progressBar->show(); //显示进度条 }
网络请求函数,并将QNetworkReply对象的三个信号和对应的槽函数关联:
//网络请求函数 void Dialog::startRequest(QUrl url) { reply = manager->get(QNetworkRequest(url));//发送网络请求 connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead()));//每当有数据可以读取时,发送readyRead()信号 connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateDataReadProgress(qint64,qint64)));//每当网络请求的下载进度更新时,发送downloadProgress()信号用于更新进度条 connect(reply,SIGNAL(finished()),this,SLOT(httpFinished()));//每当应答处理结束时,发送finish()信号 }
读取数据槽函数:
//槽函数——首先判断是否创建了文件,如果是则读取所有数据并写入文件中 void Dialog::httpReadyRead() { if(file)file->write(reply->readAll()); }
设置进度条槽函数:
//设置进度条的最大值和当前值 void Dialog::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes) { progressBar->setMaximum(totalBytes); progressBar->setValue(bytesRead); }
下载完成槽函数:
//当下载完成时,重新隐藏进度条,删除reply和file对象 void Dialog::httpFinished() { QMessageBox::information(this,"success","下载完成!");//提示 progressBar->hide(); file->flush(); file->close(); reply->deleteLater(); reply = 0; delete file; file = 0; }五、效果演示
可以在QQ官网(https://im.qq.com/pcqq),右键“立即下载”,选中“复制链接”,将链接复制粗来:
https://dldir1.qq.com/qqfile/qq/PCQQ9.5.6/QQ9.5.6.28129.exe
然后在项目中输出链接,点击下载效果如下:
下载完成后,可以在项目中找到该文件。
如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/77823351
ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)