• #QT(网络文件下载)


    1.IDE:QTCreator


    2.实验:从网络上下载devc++

    链接:http://crxzc.198424.com/dev-cpp_5.11_setup.zip


    3.记录:

    (1)主界面

    (2)check box

     

    (3)缺省路径的实现

    1. void Widget::on_defaultpath_pb_clicked() //缺省路径按钮按下时
    2. {
    3. QString path="c:/Users/***/Desktop/music_path/"; // '/'后面接文件的名字,即为存放在music_path路径下面的文件
    4. ui->keeppath_text->setText(path);
    5. }

    (4)下载进度加载实现

    1. void Widget::DownLoad_Progress(qint64 byteNow,qint64 byteTotal) //下载进度
    2. {
    3. ui->downloadprogress_bar->setMaximum(byteTotal);
    4. ui->downloadprogress_bar->setValue(byteNow);
    5. }

    (5)下载的实现

    1. void Widget::Network_ReadyToDownload() //准备下载
    2. {
    3. downloadfile->write(networkreply->readAll()); //把所有得到的响应数据写入downloadfile里面
    4. }

    (6)网络回应的实现

    1. void Widget::Network_Reply() //网络回应
    2. {
    3. QFileInfo fileinfo;
    4. fileinfo.setFile(downloadfile->fileName());
    5. downloadfile->close();
    6. delete downloadfile;
    7. downloadfile=Q_NULLPTR;
    8. networkreply->deleteLater();
    9. networkreply=Q_NULLPTR;
    10. if(ui->openafterdownload_check->isChecked()){ //下载完成后打开勾选
    11. QDesktopServices::openUrl(QUrl::fromLocalFile(fileinfo.absolutePath()));
    12. ui->download_pb->setEnabled(true);
    13. }
    14. }

     (7)下载按钮按下时进行

    1. void Widget::on_download_pb_clicked() //下载按钮按下时
    2. {
    3. QString url_text=ui->url_text->text().trimmed(); //trimmed可以去掉空格
    4. if(url_text.isEmpty()) //先检验是否输入
    5. QMessageBox::information(this,"empty!","请输入网址");
    6. QUrl url=QUrl::fromUserInput(url_text);
    7. if(!url.isValid()) //检查网址是否无效
    8. {
    9. QMessageBox::information(this,"invalid url!",QString("无效的网址%1\n错误信息%2").arg(url_text,url.errorString())); //打印错误信息
    10. return;
    11. }
    12. if(ui->keeppath_text->text().isEmpty()) //检查保存路径是否为空
    13. {
    14. QMessageBox::information(this,"路径错误","请输入路径");
    15. return;
    16. }
    17. QString keep_path=ui->keeppath_text->text().trimmed()+url.fileName(); //传入路径(组合)
    18. if(QFile::exists(keep_path)) //判断路径是否存在
    19. QFile::remove(keep_path);
    20. downloadfile=new QFile(keep_path);
    21. if(!downloadfile->open(QIODevice::WriteOnly)){
    22. QMessageBox::information(this,"出错了","临时文件打开失败");
    23. return;
    24. }
    25. ui->download_pb->setDisabled(true); //禁止再次点击下载(下载中)
    26. networkreply=networkaccessmanager.get(QNetworkRequest(url)); //获取网络请求回应
    27. connect(networkreply,SIGNAL(finished()),this,SLOT(Network_Reply())); //获得网络回应
    28. connect(networkreply,SIGNAL(readyRead()),this,SLOT(Network_ReadyToDownload())); //准备下载
    29. connect(networkreply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(DownLoad_Progress(qint64,qint64))); //下载进度
    30. }

    4.代码

    pro

    1. QT += core gui network
    2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    3. CONFIG += c++17
    4. # You can make your code fail to compile if it uses deprecated APIs.
    5. # In order to do so, uncomment the following line.
    6. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
    7. SOURCES += \
    8. main.cpp \
    9. widget.cpp
    10. HEADERS += \
    11. widget.h
    12. FORMS += \
    13. widget.ui
    14. # Default rules for deployment.
    15. qnx: target.path = /tmp/$${TARGET}/bin
    16. else: unix:!android: target.path = /opt/$${TARGET}/bin
    17. !isEmpty(target.path): INSTALLS += target

    widget.cpp

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. Widget::Widget(QWidget *parent)
    9. : QWidget(parent)
    10. , ui(new Ui::Widget)
    11. {
    12. ui->setupUi(this);
    13. }
    14. Widget::~Widget()
    15. {
    16. delete ui;
    17. }
    18. void Widget::Network_Reply() //网络回应
    19. {
    20. QFileInfo fileinfo;
    21. fileinfo.setFile(downloadfile->fileName());
    22. downloadfile->close();
    23. delete downloadfile;
    24. downloadfile=Q_NULLPTR;
    25. networkreply->deleteLater();
    26. networkreply=Q_NULLPTR;
    27. if(ui->openafterdownload_check->isChecked()){ //下载完成后打开勾选
    28. QDesktopServices::openUrl(QUrl::fromLocalFile(fileinfo.absolutePath()));
    29. ui->download_pb->setEnabled(true);
    30. }
    31. }
    32. void Widget::Network_ReadyToDownload() //准备下载
    33. {
    34. downloadfile->write(networkreply->readAll()); //把所有得到的响应数据写入downloadfile里面
    35. }
    36. void Widget::DownLoad_Progress(qint64 byteNow,qint64 byteTotal) //下载进度
    37. {
    38. ui->downloadprogress_bar->setMaximum(byteTotal);
    39. ui->downloadprogress_bar->setValue(byteNow);
    40. }
    41. void Widget::on_defaultpath_pb_clicked() //缺省路径按钮按下时
    42. {
    43. QString path="c:/Users/***/Desktop/music_path/"; // '/'后面接文件的名字,即为存放在music_path路径下面的文件
    44. ui->keeppath_text->setText(path);
    45. }
    46. void Widget::on_download_pb_clicked() //下载按钮按下时
    47. {
    48. QString url_text=ui->url_text->text().trimmed(); //trimmed可以去掉空格
    49. if(url_text.isEmpty()) //先检验是否输入
    50. QMessageBox::information(this,"empty!","请输入网址");
    51. QUrl url=QUrl::fromUserInput(url_text);
    52. if(!url.isValid()) //检查网址是否无效
    53. {
    54. QMessageBox::information(this,"invalid url!",QString("无效的网址%1\n错误信息%2").arg(url_text,url.errorString())); //打印错误信息
    55. return;
    56. }
    57. if(ui->keeppath_text->text().isEmpty()) //检查保存路径是否为空
    58. {
    59. QMessageBox::information(this,"路径错误","请输入路径");
    60. return;
    61. }
    62. QString keep_path=ui->keeppath_text->text().trimmed()+url.fileName(); //传入路径(组合)
    63. if(QFile::exists(keep_path)) //判断路径是否存在
    64. QFile::remove(keep_path);
    65. downloadfile=new QFile(keep_path);
    66. if(!downloadfile->open(QIODevice::WriteOnly)){
    67. QMessageBox::information(this,"出错了","临时文件打开失败");
    68. return;
    69. }
    70. ui->download_pb->setDisabled(true); //禁止再次点击下载(下载中)
    71. networkreply=networkaccessmanager.get(QNetworkRequest(url)); //获取网络请求回应
    72. connect(networkreply,SIGNAL(finished()),this,SLOT(Network_Reply())); //获得网络回应
    73. connect(networkreply,SIGNAL(readyRead()),this,SLOT(Network_ReadyToDownload())); //准备下载
    74. connect(networkreply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(DownLoad_Progress(qint64,qint64))); //下载进度,注意信号是QT自带的函数,而槽是自己定义在头文件的
    75. }

    widget.h

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. QT_BEGIN_NAMESPACE
    9. namespace Ui {
    10. class Widget;
    11. }
    12. QT_END_NAMESPACE
    13. class Widget : public QWidget
    14. {
    15. Q_OBJECT
    16. private: //
    17. QNetworkAccessManager networkaccessmanager;
    18. QNetworkReply *networkreply;
    19. QFile *downloadfile;
    20. private slots:
    21. void Network_Reply(); //网络回应
    22. void Network_ReadyToDownload(); //准备下载
    23. void DownLoad_Progress(qint64 byteNow,qint64 byteTotal); //下载进度
    24. void on_defaultpath_pb_clicked();
    25. void on_download_pb_clicked();
    26. public:
    27. Widget(QWidget *parent = nullptr);
    28. ~Widget();
    29. private:
    30. Ui::Widget *ui;
    31. };
    32. #endif // WIDGET_H

     

     

  • 相关阅读:
    富文本编辑器(添加列表)
    《UnityShader入门精要》学习5
    何时Xcode中CoreData托管对象Optional和Default Value选项会变得尤为敏感?
    历届蓝桥杯青少年编程比赛 计算思维题真题解析【已更新5套 持续更新中】
    使用一键重装系统后,如何删除多余的PE系统引导菜单?
    跳过wifi认证直接上网
    SpringBoot-03-Springboot自动装配原理
    最小生成树
    ref实现input自动获取光标并执行多次
    【牛客 - 剑指offer】JZ15 二进制中1的个数 Java实现 | 原码、反码、补码
  • 原文地址:https://blog.csdn.net/byhyf83862547/article/details/136625724