【问题标题】:Crashing of application QT(ftp downloading with progressbar)应用程序 QT 崩溃(带进度条的 ftp 下载)
【发布时间】:2023-04-01 17:00:02
【问题描述】:

我想创建一个应用程序,通过这个我可以从我的 ftp 服务器下载文件 并在进度条中显示进度。我写了一些代码,但如果我点击按钮从 ftp 服务器下载文件,我的应用程序就会崩溃。我已经变成了一些 qDebug 答案,例如:

"无错误请求", "updateDataTransferProgress 开始"

必须下载的文件是在一个文件夹中创建的,但文件是空的。:(你能做些什么来解决我的问题?

非常感谢!

    #include "f1.h"
    #include "ui_f1.h"

    #include "ui_form2.h"
    #include "form2.h"


    #include <QNetworkAccessManager>
    #include <QFile>
    #include <QFtp>
    #include <QtNetwork>
    #include <QMessageBox>


    f1::f1(QWidget *parent) :
        QFrame(parent),
        ui(new Ui::f1)
    {
        ui->setupUi(this);
       // ui->progressBar->setValue(0);

        connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(onDownServ()));


    }

    void f1::closeEvent(QCloseEvent *event)
    {

        F2->helloWorld();

    }



    f1::~f1()
    {
        delete ui;
    }


    void f1::onDownServ()
    {



        QNetworkAccessManager *nam = new QNetworkAccessManager();
            QUrl url2("ftp://test.cz/plugins.txt");
            url2.setPassword("test");
            url2.setUserName("test");



          reply = nam->get(QNetworkRequest(url2));


        connect(reply, SIGNAL(readyRead()), this, SLOT(readyRead()));
        connect(reply, SIGNAL(downloadProgress(qint64, qint64)),this, SLOT(updateDataTransferProgress(qint64,qint64)));
        connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(requestError(QNetworkReply::NetworkError)));
        connect(reply, SIGNAL(finished()), this, SLOT(requestFinished()));

    }

    void f1::requestFinished()
    {

    qDebug() << "finished !";

    save->flush();
    save->close();

    }

    void f1::requestError(QNetworkReply::NetworkError)
    {
        qDebug() << "no errors, request";
    }

    void f1::readyRead()
    {
    qDebug() << "ready read!";

    save=new QFile("plugins.txt");

        if (!save->open(QIODevice::WriteOnly))
            return;

        save->write(reply->readAll());




    }

    void f1::updateDataTransferProgress(qint64 done, qint64 total)
    {
        qDebug() << "updateDataTransferProgress started";
        ui->progressBar->setMaximum(100);
        ui->progressBar->setValue(done*100/total);


    }

【问题讨论】:

    标签: c++ qt ftp progress-bar qnetworkaccessmanager


    【解决方案1】:

    QNetworkReply 是一个顺序访问QIODevice,只要从网络接收到更多数据,就会发出readyRead() 信号。因此,随着新数据的逐渐出现,您的 readyRead() 插槽可能会被多次调用。所以你不应该在那个槽中初始化你的文件。文件初始化应该在onDownServ()槽中完成一次:

    QNetworkAccessManager *nam = new QNetworkAccessManager();
    QUrl url2("ftp://test.cz/plugins.txt");
    url2.setPassword("test");
    url2.setUserName("test");
    
    
    save=new QFile("plugins.txt");
    if (!save->open(QIODevice::WriteOnly))
       return;
    
    reply = nam->get(QNetworkRequest(url2));
    

    当您在readyRead() 槽中进行文件初始化时,它会在第一次调用中打开文件并返回后续调用,因为它无法打开新文件进行写操作。因此,readyRead() 插槽被反复调用,应用程序崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 2018-12-07
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多