Qt pobieranie plików

1

Hej, mam problem przy pisaniu prostej aplikacji w Qt do pobierania plików. Starałem się dostosować do swoich potrzeb ten przykład: http://doc.qt.nokia.com/4.7-snapshot/network-downloadmanager.html Oto mój kod:

downloader.h

#ifndef DOWNLOADER_H
#define DOWNLOADER_H

#include <QObject>
#include <QtNetwork>
#include <QDebug>

class Downloader : public QObject
{
    Q_OBJECT
public:
    explicit Downloader(QStringList list, QObject *parent = 0);
    void downloadStarted();
    QString file;
    QFile *filetxt;
    QString startName;
    //QString from_Wav_Filename;
    QStringList wordlist;


    void append(const QUrl &url);
    void append(const QStringList &urllist);

    void doDownload();


    int size;

signals:
   // void finished();

public slots:
    void downloadFinished();
    void downloadReadyRead();
    void do_Download();


private:
    QNetworkAccessManager manager;
    QNetworkReply *reply;
    QQueue<QUrl> downloadQueue;

};

#endif // DOWNLOADER_H 

downloader.cpp

 #include "downloader.h"

Downloader::Downloader(QStringList list, QObject *parent) :
    QObject(parent)
{   

    size = list.size();

    for(int it=0; it<size; it++) {
        QString str = "http://www.merriam.webster.com/dictionary/" + list.at(it);
        wordlist.push_back(str);
    }

    append(wordlist);

}

void Downloader::append(const QUrl &url)
{

    if(downloadQueue.isEmpty())
        QTimer::singleShot(0, this, SLOT(do_Download()));

    downloadQueue.enqueue(url);

}

void Downloader::append(const QStringList &urllist)
{
    foreach(QString url, urllist)
        append(QUrl(url));

}

void Downloader::do_Download()
{


    QUrl url = downloadQueue.dequeue();
    QString filename =  "G:/Documents and Settings/User/Desktop/downloader" + url.path() + ".txt";


    qDebug() << filename;
    filetxt = new QFile(filename);

    if(!filetxt->open(QIODevice::WriteOnly))
        {

        qDebug() << "Unable to save the file";

            delete filetxt;
            filetxt = NULL;
            return;
        }


    reply = manager.get(QNetworkRequest(url));

    connect(reply, SIGNAL(finished()), this, SLOT(downloadFinished()));
    connect(reply, SIGNAL(readyRead()), this, SLOT(downloadReadyRead()));

    qDebug() << "I'm in downloadStarted()";

}

void Downloader::downloadReadyRead()
{

        if(file.isEmpty()) file = reply->readAll();

        if(!file.isEmpty()) {

          //  qDebug() << file;
            qDebug() << "I'm in downloadReadyRead()";

            filetxt->write(reply->readAll());
        }

}

void Downloader::downloadFinished()
{

    if(reply->error())
    {

        qDebug() << "Download failed";
    }

    // qDebug() << file;

    if(filetxt)
            {
                filetxt->flush();
                filetxt->close();

            }


    reply->deleteLater();
    reply = NULL;


    qDebug() << "I'm in downloadFinished()";

    do_Download();

}

Oto komunikat błędu : "Host www.merriam.webster.com not found"
Mógłby ktoś pomóc?

0

Masz odpowiedź w komunikacie. Wklej adres do przeglądarki - coś Ci się otworzy? Użyj polecenia ping - pakiety nie dotrą. Reasumując - podany adres www.merriam.webster.com jest nieosiągalny - takiego adresu nie ma. Z tego co widzę to jest adres merriam.webster.com ale on z kolei coś nie odpowiada, natomiast jest wpis na serwerach DNS.

0

Bo nie ma takiej strony. :-| Znajdź jakiś działający adres i zobacz.

0

Damn, chodziło mi oczywiście o http://www.merriam-webster.com. Wówczas program też się wysypuje ale w innym miejscu

0

A w którym miejscu?

0

Ciężko ci się pomaga...

1

Przepraszam za tą chaotyczność. Niestety w zamieszczonym kodzie doszukałem się błędu odnośnie zapisu do pliku.

W headerze dodatkowo powinno znaleźć się :

  QFile output; 

Slot do_Download powinien wyglądać tak:

 void Downloader::do_Download()
{


    QUrl url = downloadQueue.dequeue();
    QString filename =  "G:/Documents and Settings/Olek/Pulpit/downloader" + url.path() + ".txt";


    qDebug() << filename;

    output.setFileName(filename);
    if(!output.open(QIODevice::WriteOnly)) {

        qDebug() << "Problem opening save file";
        do_Download();
        return;

    }


    reply = manager.get(QNetworkRequest(url));

    connect(reply, SIGNAL(finished()), this, SLOT(downloadFinished()));
    connect(reply, SIGNAL(readyRead()), this, SLOT(downloadReadyRead()));

    qDebug() << "I'm in downloadStarted()";

}

A downloadReadyRead powinien wyglądać tak:

void Downloader::downloadReadyRead()
{

    output.write(reply->readAll());
    if(file.isEmpty()) file = reply->readAll();

}
 

Teraz pliki się pobierają, ale program kończy pracę wywalając Runtime Error;

1

mógłby ktoś usunąć ten temat. przepraszam najmocniej, człowiek myśli całe dnie nad rozwiązaniem problemu, wrzuca do na 4programmers, a po chwili sam znajduje rozwiązanie. Najmocniej przepraszam za ten niepotrzebny temat.

1 użytkowników online, w tym zalogowanych: 0, gości: 1