1 实现高层网络操作的类
QT网络模块提供一些类实现OSI 7层网络模型中高层的网络协议,如HTTP、FTP、SNMP等。
QNetworkRequest类通过一个URL地址发起网络协议请求,也保存网络请求的信息,目前支持HTTP、FTP、URLs的下载或上传。
QNetworkAccessManager类用于协调网络操作,QNetworkRequest发起一个请求后,QNetworkAccessManager用于发送网络请求,创建网络响应。
QNetworkReply类表示网络请求的响应,是QIODevice的子类,支持流读写功能,也支持异步或同步工作模式。提供信号finished()、readyRead()、downloadProgress()可用于监测网络响应的执行情况,执行相应的操作。
2 基于HTTP的网络文件下载
网络文件URL地址可以用来获取文件。
#include <QMessageBox>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>
#include <QDesktopServices>
QFile* downloadedFile;
void MainWindow::on_btnDownload_clicked()
{//开始下载 按钮
QString urlSpec = ui->editURL->text().trimmed();//删去开头和结尾的空字符
if (urlSpec.isEmpty())
{
QMessageBox::information(this, "错误","请指定需要下载的URL");
return;
}
QUrl newUrl = QUrl::fromUserInput(urlSpec);//根据用户输入的字符串转换成合法的URL地址
if (!newUrl.isValid())
{
QMessageBox::information(this, "错误", QString("无效URL: %1 \n 错误信息: %2").arg(urlSpec, newUrl.errorString()));
return;
}
QString tempDir = ui->editPath->text().trimmed();//获取指定的临时目录
if (tempDir.isEmpty())
{
QMessageBox::information(this, tr("错误"), "请指定保存下载文件的目录");
return;
}
QString fullFileName = tempDir + newUrl.fileName(); //临时文件名
if (QFile::exists(fullFileName))
QFile::remove(fullFileName);
downloadedFile =new QFile(fullFileName);//创建临时文件
if (!downloadedFile->open(QIODevice::WriteOnly))
{
QMessageBox::information(this, tr("错误"),"临时文件打开错误");
return;
}
QNetworkAccessManager networkManager;//网络管理
QNetworkReply* reply = networkManager.get(QNetworkRequest(newUrl));//发布网络请求,请求下载URL地址表示的文件,并创建网络响应
connect(reply, SIGNAL(finished()), this, SLOT(on_finished()));//响应结束后发射
connect(reply, SIGNAL(readyRead()), this, SLOT(on_readyRead()));//缓冲区有新下载的数据等待读取时发射
connect(reply, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(on_downloadProgress(qint64,qint64)));//表示网络操作进度的信号,表示已读取字节数和总字节数
}
void MainWindow::on_readyRead()
{//读取下载的数据
downloadedFile->write(reply->readAll());
}
void MainWindow::on_downloadProgress(qint64 bytesRead, qint64 totalBytes)
{//下载进程
ui->progressBar->setMaximum(totalBytes);
ui->progressBar->setValue(bytesRead);
}
void MainWindow::on_finished()
{//网络响应结束,下载完毕
QFileInfo fileInfo;
fileInfo.setFile(downloadedFile->fileName());
downloadedFile->close();
delete downloadedFile;
downloadedFile = Q_NULLPTR;
reply->deleteLater(); //
reply = Q_NULLPTR;
if (ui->checkOpen->isChecked())//打开下载的文件
QDesktopServices::openUrl(QUrl::fromLocalFile(fileInfo.absoluteFilePath()));
ui->btnDownload->setEnabled(true);
}
3849

被折叠的 条评论
为什么被折叠?



