0

我有一个非常混乱的问题。Qt5 QNetworkAccessManager完成信号永不发射

我有一个简单的项目,从一些ftp服务器下载文件。它工作得很好。然后,我尝试将相同的代码实现到一个更大的项目中(第一个是控制台应用程序,第二个是GUI,但我不认为这会改变任何内容)。

在做了一些调试之后,在我看来,finished()信号从QNetworkAccessManager以某种方式永远不会发射(或接收)。 同样,完全相同的代码行作为单独的项目工作。

downloader.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 

downloader.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())); 
} 

不能让我的头解决这个问题。

欢迎任何帮助,

谢谢!

编辑>更多信息: 调试器的帖子这个>

网址,调试

项:doDownload

退出:doDownload

回答

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())); 
} 
+0

你说得对。它根本不会发生在我身上。 谢谢! – Rorschach 2015-04-03 16:45:30