Qt网络模块提供的一些类实现了OSI七层协议网络模型中高层的网络协议,如HTTP、FTP、SNMP等,这些类主要是QNetworkRequest、QNetworkReply和QNetworkAccessManager。
今天这个程序的运行如下:
其中mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QFile>
#include <QMessageBox>
#include <QDir>
#include <QDesktopServices>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
//网络管理 协调网络工作在Qnetworkrequest发起一个网络请求后,它负责发送网络请求 创建网络响应
QNetworkAccessManager networkManager;
//表示网络请求的响应,它提供finished readyRead downloadPorgress信号监测网络响应的执行的情况
//因为它是QIODevice的子类,所以它支持流的读写功能以及异步或者同步的工作模式
QNetworkReply *reply;
//下载保存的临时文件
QFile *downloadFile;
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_finished();
void on_readRead();
void on_downloadProgress(qint64 bytesRead,qint64 totalBytes);
void on_btn_download_clicked();
void on_btn_default_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
//网络响应结束
//关闭临时文件 删除文件变量和网络响应变量
void MainWindow::on_finished()
{
QFileInfo fileInfo;
fileInfo.setFile(downloadFile->fileName());
downloadFile->close();
delete downloadFile;
//这个Q_NULLPR就是一个宏支持C++11 为nullptr 不支持为NULL
downloadFile=Q_NULLPTR;
reply->deleteLater();
reply=Q_NULLPTR;
if(ui->radioButton->isChecked()){
//调用缺省的应用软件打开下载的文件
QDesktopServices::openUrl(QUrl::fromLocalFile(fileInfo.absoluteFilePath()));
}
ui->btn_download->setEnabled(true);
}
//读取下载的缓冲区的数据到临时文件
void MainWindow::on_readRead()
{
downloadFile->write(reply->readAll());
}
//下载进程 已读取的字节数和总的字节数
void MainWindow::on_downloadProgress(qint64 bytesRead, qint64 totalBytes)
{
ui->progressBar->setMaximum(totalBytes);
ui->progressBar->setValue(bytesRead);
}
//按钮下载
void MainWindow::on_btn_download_clicked()
{
//trimmed会去除首尾的空白字符串但是中间的空格不会去除 simplified()也会去除首尾的空格但是中间的空格会去除剩一个
QString urlSpec=ui->lineEdit_Url->text().trimmed();
if(urlSpec.isEmpty()){
QMessageBox::information(this,"错误","请指定下载位置");
return;
}
//根据用户输入的字符串转换为合法的URL地址
QUrl newUrl=QUrl::fromUserInput(urlSpec);
if(!newUrl.isValid()){
QMessageBox::information(this,"错误",QString("无效URL: %1 \n 错误信息: %2")
.arg(urlSpec,newUrl.errorString()));
return;
}
//获取指定的临时目录
QString tempDir=ui->lineEdit_2->text().trimmed();
if(tempDir.isEmpty()){
QMessageBox::information(this,"错误","请指定下载文件的目录");
return;
}
//临时文件名
QString fullFileName=tempDir+newUrl.fileName();
if(QFile::exists(fullFileName))
QFile::remove(fullFileName);
//创建临时文件
downloadFile=new QFile(fullFileName);
if(!downloadFile->open(QIODevice::WriteOnly)){
QMessageBox::information(this,"错误","临时文件打开错误");
return;
}
ui->btn_download->setEnabled(false);
//QNetworkRequest是通过一个url地址发起网络请求,也保存网络请求的消息,目前支持HTTP FTP和局部文件URLs的上传
reply=networkManager.get(QNetworkRequest(newUrl));
connect(reply,SIGNAL(finished()),this,SLOT(on_finished()));
connect(reply,SIGNAL(readyRead()),this,SLOT(on_readRead()));
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(on_downloadProgress(qint64,qint64)));
}
//按钮 缺省路径就是在当前目录下创建一个临时文件夹
void MainWindow::on_btn_default_clicked()
{
QString curPath=QDir::currentPath();
QDir dir(curPath);
QString sub="temp";
dir.mkdir(sub);
ui->lineEdit_2->setText(curPath+"/"+sub+"/");
}
mainwindow.ui: