gpt4 book ai didi

c++ - 应用程序QT崩溃(带进度条的ftp下载)

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:56 26 4
gpt4 key购买 nike

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

"no errors request", "updateDataTransferProgress started"

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

非常感谢!

    #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);


}

最佳答案

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() 槽被重复调用,应用程序崩溃。

关于c++ - 应用程序QT崩溃(带进度条的ftp下载),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23528707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com