要使用Qt Network模块中的类,要在工程文件中加入以下一行代码:
QT += network
处理网络请求的类: QNetworkRequest
协调网络操作、调度创建好的请求,发射信号报告进度 :QNetworkAccessManager
网络请求应答: QNetworkReply
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
HTTP
http通信实例: 实现一个简单HTTP文件下载小工具
使用到的QNetworkReply
信号:
[signal] void QIODevice::readyRead() //读就绪,继承自QIODevice类
signal] void QNetworkReply::finished() //完成
[signal] void QNetworkReply::downloadProgress(qint64 bytesReceived,
qint64 bytesTotal)
//下载进度
实例
1、创建工程,添加一些私有变量和槽
class HttpDownload : public QMainWindow
{
Q_OBJECT
public:
explicit HttpDownload(QWidget *parent = 0);
~HttpDownload();
//添加以下槽
void startDownload(void);
void httpReadyRead(void);
void updateDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
void httpDownloadFinish(void);
private:
Ui::HttpDownload *ui;
//添加以下私有变量
QUrl url; //URL
QFile *file; //文件
QNetworkAccessManager *networkManager; //网络管理
QNetworkReply *netReply; //应答
};
2、构造函数初始化
HttpDownload::HttpDownload(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::HttpDownload)
{
ui->setupUi(this);
ui->progressBar->setValue(0);
networkManager = new QNetworkAccessManager;
connect(ui->pushButton, &QPushButton::clicked, this, &HttpDownload::startDownload);
}
3、实现startDownload
void HttpDownload::startDownload()
{
url = ui->lineEdit->text(); //获取下载地址
qDebug() << url.path();
QFileInfo fileInfo(url.path()); //获取文件信息
QString fileName(fileInfo.fileName()); //获取文件名
qDebug() << fileName;
if (fileName.isEmpty())
{
fileName = "index.html";
}
file = new QFile(fileName);
if (!file->open(QIODevice::WriteOnly)) //打开文件
{
delete file;
file = 0;
return;
}
netReply = networkManager->get(QNetworkRequest((url))); //开始网络请求
ui->progressBar->setValue(0); //设置进度条的进度为0
//链接到QNetworkReply提供的信号
connect(this->netReply, &QNetworkReply::readyRead, this, &HttpDownload::httpReadyRead);
connect(this->netReply, &QNetworkReply::downloadProgress, this, &HttpDownload::updateDownloadProgress);
connect(this->netReply, &QNetworkReply::finished, this, &HttpDownload::httpDownloadFinish);
}
4、实现httpReadyRead
void HttpDownload::httpReadyRead()
{
if (file)
{
file->write(netReply->readAll()); //将读取得所有数据写入文件
}
}
5、实现更新进度条的updateDownloadProgress
void HttpDownload::updateDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
ui->progressBar->setValue(bytesReceived); //更新进度条
ui->progressBar->setMaximum(bytesTotal);
}
6、对下载完成后做处理httpDownloadFinish
void HttpDownload::httpDownloadFinish()
{
ui->progressBar->setValue(0); //下载结束,设置进度条为0
if (file)
{
file->close(); //关闭文件
delete file; //释放分配的内存空间
file = 0;
}
netReply->deleteLater(); //异步删除
netReply = 0;
}
下载个微信: