gpt4 book ai didi

Qt5 QNetworkAccessManager 完成信号从不发出

转载 作者:行者123 更新时间:2023-12-04 18:04:26 26 4
gpt4 key购买 nike

我有一个非常困惑的问题。

我有一个简单的项目,它从一些 ftp 服务器下载文件。效果非常好。

然后,我尝试将相同的代码实现到一个更大的项目中(第一个是控制台应用程序,第二个是 GUI,但我认为这不会改变任何东西......)。

在进行一些调试后,在我看来,QNetworkAccessManager 发出的 finished() 信号永远不会发出(或接收)。同样,完全相同的代码行作为一个单独的项目工作。

下载器.h

#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

下载器.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();

}

mainwindow.cpp(重要部分)

void MainWindow::on_actionDownloadFirmwareImage_triggered()
{
Downloader d;

QUrl url("ftp://ftp.xenbase.org/pub/Genomics/JGI/Xenla6.0/Xenla_6.0_JGI_Gene_Models.fasta.tgz");

qDebug() << "url, debug";
ui->plainTextEdit->appendPlainText(url.toDisplayString());

d.doDownload(url);

QObject::connect(&d,SIGNAL(dloadend()),this, SLOT(printDLend()));
}

无法解决这个问题。

欢迎任何帮助,

谢谢!

编辑> 更多信息:调试器发布这个>

网址,调试

入口:做下载

退出:执行下载

最佳答案

您在堆栈上创建对象 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()));
}

关于Qt5 QNetworkAccessManager 完成信号从不发出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29430758/

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