应用程序 QT 崩溃(带进度条的 ftp 下载)
Posted
技术标签:
【中文标题】应用程序 QT 崩溃(带进度条的 ftp 下载)【英文标题】:Crashing of application QT(ftp downloading with progressbar) 【发布时间】:2014-05-07 21:23:47 【问题描述】:我想创建一个应用程序,通过这个我可以从我的 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);
【问题讨论】:
【参考方案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()
插槽被反复调用,应用程序崩溃。
【讨论】:
以上是关于应用程序 QT 崩溃(带进度条的 ftp 下载)的主要内容,如果未能解决你的问题,请参考以下文章