0

У меня очень запутанная проблема.Qt5 QNetworkAccessManager готовый сигнал никогда не испускает

У меня был простой проект, который загружал файлы с некоторых ftp-серверов. Он работал очень хорошо.

Затем я попытался реализовать этот же код в более крупном проекте (первым из них было консольное приложение, а второе - графическим интерфейсом, но я не думаю, что это что-то меняет ..).

После некоторой отладки мне кажется, что 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())); 
} 

Не удается получить мою голову вокруг этого.

Любые помощь приветствуется,

Thanks!

EDIT> Подробнее: сообщений Debugger это>

URL, отлаживать

запись: doDownload

выход: doDownload

ответ

0

Вы создаете объект Downloader на стек и удаляется право после выхода из вашей функции. Вы должны создать объект, используя new, и предоставить объект MainWindow как родительский, поэтому после закрытия MainWindow объект будет уничтожен. Если загрузка завершена, вам все равно нужно уничтожить объект, поэтому просто подключите сигнал dloadend() к слоту deleteLater(), Qt loop удалит ваш объект сразу после обработки всех сигналов.

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

 Смежные вопросы

  • Нет связанных вопросов^_^