1.IDE:QTCreator
2.实验:从网络上下载devc++
链接:http://crxzc.198424.com/dev-cpp_5.11_setup.zip
3.记录:
(1)主界面
(2)check box
(3)缺省路径的实现
void Widget::on_defaultpath_pb_clicked() //缺省路径按钮按下时
{QString path="c:/Users/***/Desktop/music_path/"; // '/'后面接文件的名字,即为存放在music_path路径下面的文件ui->keeppath_text->setText(path);
}
(4)下载进度加载实现
void Widget::DownLoad_Progress(qint64 byteNow,qint64 byteTotal) //下载进度
{ui->downloadprogress_bar->setMaximum(byteTotal);ui->downloadprogress_bar->setValue(byteNow);
}
(5)下载的实现
void Widget::Network_ReadyToDownload() //准备下载
{downloadfile->write(networkreply->readAll()); //把所有得到的响应数据写入downloadfile里面
}
(6)网络回应的实现
void Widget::Network_Reply() //网络回应
{QFileInfo fileinfo;fileinfo.setFile(downloadfile->fileName());downloadfile->close();delete downloadfile;downloadfile=Q_NULLPTR;networkreply->deleteLater();networkreply=Q_NULLPTR;if(ui->openafterdownload_check->isChecked()){ //下载完成后打开勾选QDesktopServices::openUrl(QUrl::fromLocalFile(fileinfo.absolutePath()));ui->download_pb->setEnabled(true);}}
(7)下载按钮按下时进行
void Widget::on_download_pb_clicked() //下载按钮按下时
{QString url_text=ui->url_text->text().trimmed(); //trimmed可以去掉空格if(url_text.isEmpty()) //先检验是否输入QMessageBox::information(this,"empty!","请输入网址");QUrl url=QUrl::fromUserInput(url_text);if(!url.isValid()) //检查网址是否无效{QMessageBox::information(this,"invalid url!",QString("无效的网址%1\n错误信息%2").arg(url_text,url.errorString())); //打印错误信息return;}if(ui->keeppath_text->text().isEmpty()) //检查保存路径是否为空{QMessageBox::information(this,"路径错误","请输入路径");return;}QString keep_path=ui->keeppath_text->text().trimmed()+url.fileName(); //传入路径(组合)if(QFile::exists(keep_path)) //判断路径是否存在QFile::remove(keep_path);downloadfile=new QFile(keep_path);if(!downloadfile->open(QIODevice::WriteOnly)){QMessageBox::information(this,"出错了","临时文件打开失败");return;}ui->download_pb->setDisabled(true); //禁止再次点击下载(下载中)networkreply=networkaccessmanager.get(QNetworkRequest(url)); //获取网络请求回应connect(networkreply,SIGNAL(finished()),this,SLOT(Network_Reply())); //获得网络回应connect(networkreply,SIGNAL(readyRead()),this,SLOT(Network_ReadyToDownload())); //准备下载connect(networkreply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(DownLoad_Progress(qint64,qint64))); //下载进度}
4.代码
pro
QT += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++17# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QFile>
#include <QFileInfo>
#include <QDesktopServices>
#include <QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::Network_Reply() //网络回应
{QFileInfo fileinfo;fileinfo.setFile(downloadfile->fileName());downloadfile->close();delete downloadfile;downloadfile=Q_NULLPTR;networkreply->deleteLater();networkreply=Q_NULLPTR;if(ui->openafterdownload_check->isChecked()){ //下载完成后打开勾选QDesktopServices::openUrl(QUrl::fromLocalFile(fileinfo.absolutePath()));ui->download_pb->setEnabled(true);}}
void Widget::Network_ReadyToDownload() //准备下载
{downloadfile->write(networkreply->readAll()); //把所有得到的响应数据写入downloadfile里面
}
void Widget::DownLoad_Progress(qint64 byteNow,qint64 byteTotal) //下载进度
{ui->downloadprogress_bar->setMaximum(byteTotal);ui->downloadprogress_bar->setValue(byteNow);
}void Widget::on_defaultpath_pb_clicked() //缺省路径按钮按下时
{QString path="c:/Users/***/Desktop/music_path/"; // '/'后面接文件的名字,即为存放在music_path路径下面的文件ui->keeppath_text->setText(path);
}void Widget::on_download_pb_clicked() //下载按钮按下时
{QString url_text=ui->url_text->text().trimmed(); //trimmed可以去掉空格if(url_text.isEmpty()) //先检验是否输入QMessageBox::information(this,"empty!","请输入网址");QUrl url=QUrl::fromUserInput(url_text);if(!url.isValid()) //检查网址是否无效{QMessageBox::information(this,"invalid url!",QString("无效的网址%1\n错误信息%2").arg(url_text,url.errorString())); //打印错误信息return;}if(ui->keeppath_text->text().isEmpty()) //检查保存路径是否为空{QMessageBox::information(this,"路径错误","请输入路径");return;}QString keep_path=ui->keeppath_text->text().trimmed()+url.fileName(); //传入路径(组合)if(QFile::exists(keep_path)) //判断路径是否存在QFile::remove(keep_path);downloadfile=new QFile(keep_path);if(!downloadfile->open(QIODevice::WriteOnly)){QMessageBox::information(this,"出错了","临时文件打开失败");return;}ui->download_pb->setDisabled(true); //禁止再次点击下载(下载中)networkreply=networkaccessmanager.get(QNetworkRequest(url)); //获取网络请求回应connect(networkreply,SIGNAL(finished()),this,SLOT(Network_Reply())); //获得网络回应connect(networkreply,SIGNAL(readyRead()),this,SLOT(Network_ReadyToDownload())); //准备下载connect(networkreply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(DownLoad_Progress(qint64,qint64))); //下载进度,注意信号是QT自带的函数,而槽是自己定义在头文件的}
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QFile>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECT
private: //QNetworkAccessManager networkaccessmanager;QNetworkReply *networkreply;QFile *downloadfile;
private slots:void Network_Reply(); //网络回应void Network_ReadyToDownload(); //准备下载void DownLoad_Progress(qint64 byteNow,qint64 byteTotal); //下载进度void on_defaultpath_pb_clicked();void on_download_pb_clicked();public:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H