在工作当中 我们在实现软件开发以后,需要做的就是软件版本的更新迭代了。。处于方便考虑,我们可以使用QNetworkAccessManager通过http进行下载更新,以下代码可供参考:
.pro文件中需要添加:
QT += core gui network
.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QUrl>
#include <QFile>
#include <QTime>
namespace Ui {
class MainWindow;
}
class QNetworkAccessManager;
class QNetworkReply;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void saveAsFile();
void readData();
void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
void onFinished();
private:
void downLoad();
private:
Ui::MainWindow *ui;
QNetworkAccessManager *m_pManager;
QNetworkReply *m_pReply;
QUrl m_url;
QFile m_file;
QTime m_time;
qint64 m_bytesTotal;
};
#endif // MAINWINDOW_H
.cpp文件
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QMessageBox>
#include <QFileDialog>
#include <QFileInfo>
#include <QDebug>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle(QStringLiteral("HTTP下载工具"));
ui->mainToolBar->hide();
m_pReply = nullptr;
m_bytesTotal = 0;
m_pManager = new QNetworkAccessManager(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(saveAsFile()));
}
MainWindow::~MainWindow()
{
if (m_pReply && m_pReply->isOpen()) {
disconnect(m_pReply, SIGNAL(finished()), this, SLOT(onFinished()));
m_pReply->close();
}
if (m_file.isOpen()) {
m_file.close();
}
delete ui;
}
void MainWindow::saveAsFile()
{
m_url.setUrl(ui->lineEdit->text());
if (!m_url.isValid()) {
QMessageBox::critical(this, QStringLiteral("错误"), QStringLiteral("文件路径错误!"));
return;
}
QFileInfo info(ui->lineEdit->text());
QString fileName = QFileDialog::getSaveFileName(this, QStringLiteral("保存到"), ui->lineEdit->text(), info.suffix());
if (fileName.isEmpty()) {
return;
}
m_file.setFileName(fileName);
if (!m_file.open(QIODevice::WriteOnly)) {
QMessageBox::critical(this, QStringLiteral("错误"), QStringLiteral("本地文件创建失败!"));
return;
}
ui->progressBar->setValue(0);
downLoad();
ui->pushButton->setEnabled(false);
ui->lineEdit->setEnabled(false);
}
void MainWindow::readData()
{
m_file.write(m_pReply->readAll());
}
void MainWindow::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
ui->progressBar->setMaximum(bytesTotal);
ui->progressBar->setValue(bytesReceived);
m_bytesTotal = bytesTotal;
double total = (double)bytesTotal / (1024 * 1024);
double bytes = (double)bytesReceived / (1024 * 1024);
double speed = bytes / (m_time.elapsed() / 1000);
ui->statusBar->showMessage(QStringLiteral("总大小:%2MB - 已下载 %1MB - 速度: %3 MB/s").arg(bytes).arg(total).arg(speed));
}
void MainWindow::onFinished()
{
m_file.flush();
m_file.close();
m_pReply->deleteLater();
m_pReply = nullptr;
ui->pushButton->setEnabled(true);
ui->lineEdit->setEnabled(true);
double total = (double)m_bytesTotal / (1024 * 1024);
ui->statusBar->showMessage(QStringLiteral("总大小:%2MB - 已下载 %1MB - 速度: %3 MB/s").arg(total).arg(total).arg(0));
QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("下载完成!"));
}
void MainWindow::downLoad()
{
m_pReply = m_pManager->get(QNetworkRequest(m_url));
connect(m_pReply, SIGNAL(readyRead()), this, SLOT(readData()));
connect(m_pReply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(onDownloadProgress(qint64, qint64)));
connect(m_pReply, SIGNAL(finished()), this, SLOT(onFinished()));
m_time.start();
}
以下图片是界面设置: