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 network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += 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.0
SOURCES += \
main.cpp \
widget.cpp
HEADERS += \
widget.h
FORMS += \
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_NAMESPACE
class 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