我有一个非常令人困惑的问题。
我有一个从一些ftp服务器下载文件的简单项目。它工作得非常好。
然后,我尝试将相同的代码实现到一个更大的项目中(第一个是控制台应用程序,第二个是GUI,但我认为这不会改变任何东西......)。
在做了一些调试后,我觉得来自finished()
的{{1}}信号不会被发射(或接收)。
同样,完全相同的代码行作为单独的项目工作。
downloader.h
QNetworkAccessManager
downloader.cpp
#ifndef DOWNLOADER_H
#define DOWNLOADER_H
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QFile>
#include <QDebug>
class Downloader : public QObject
{
Q_OBJECT
public:
explicit Downloader(QObject *parent = 0);
signals:
void dloadend();
void printed();
public slots:
void replyFinished (QNetworkReply *reply);
void doDownload(QUrl url);
void printDLend();
private:
QNetworkAccessManager *manager;
};
#endif // DOWNLOADER_H
mainwindow.cpp(重要部分)
#include "downloader.h"
Downloader::Downloader(QObject *parent) :
QObject(parent)
{
}
void Downloader::doDownload(QUrl url)
{
qDebug()<<"entry: doDownload\n";
QNetworkRequest req(url);
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),this,SLOT(printDLend()));//SLOT(replyFinished(QNetworkReply*)));
manager -> get(req);
qDebug()<<"exit: doDownload\n";
}
void Downloader::replyFinished (QNetworkReply *reply)
{
qDebug()<<"entry: reply\n";
if(reply->error()) {
qDebug() << "ERROR!";
qDebug() << reply->errorString();
}
else
{
qDebug() << "Download finished!";
QFile *file = new QFile("C:/users/jelicicm/Desktop/test1.hex");
if(file->open(QFile::Append))
{
file->write(reply->readAll());
file->flush(); file->close();
qDebug() <<"Downloaded file size:" <<file->size() <<"Bytes";
qDebug() <<"File name: "<< file->fileName();
;
}
delete file;
}
reply->deleteLater();
manager->deleteLater();
emit dloadend();
}
无法理解这一点。
欢迎任何帮助,
谢谢!
编辑&gt;更多信息: 调试器发布此&gt;
url,debug
条目:doDownload
退出:doDownload
答案 0 :(得分:0)
您在堆栈上创建对象Downloader
,并在您的函数退出后立即删除它。您必须使用new
创建对象,并提供MainWindow
对象作为父对象,因此在关闭MainWindow后,对象将被销毁。
如果下载完成,您仍然需要销毁该对象,因此只需将dloadend()
信号连接到deleteLater()
插槽,Qt循环将在处理完所有信号后立即删除您的对象。
void MainWindow::on_actionDownloadFirmwareImage_triggered()
{
Downloader *d = new Downloader(this);
QUrl url("ftp://example.com/some.file.tgz");
qDebug() << "url, debug";
ui->plainTextEdit->appendPlainText(url.toDisplayString());
d->doDownload(url);
QObject::connect(d,SIGNAL(dloadend()),this, SLOT(printDLend()));
QObject::connect(d,SIGNAL(dloadend()), d, SLOT(deleteLater()));
}