目录
一、项目介绍
- 一、项目介绍
- 二、项目基本配置
- 三、UI界面设计
- 四、主程序实现
- 4.0 pro文件
- 4.1 dialog.h
- 4.2 dialog.cpp
- 五、效果演示
利用network相关类(QNetworkReply、QNetworkAccessManager)实现简单文件下载器功能。
二、项目基本配置新建一个Qt案例,项目名称为“DownloadTest”,基类选择“QDialog”,取消选中创建UI界面复选框,完成项目创建。
三、UI界面设计无UI界面
四、主程序实现 4.0 pro文件首先需要在两个pro文件中添加如下代码:
QT+=network
4.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()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,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~