Russian Qt Forum

Qt => Работа с сетью => Тема начата: ruzik от Июль 03, 2012, 13:06



Название: Ошибка скачки файла
Отправлено: ruzik от Июль 03, 2012, 13:06
Здравствуйте, у меня есть код:
Код:
    qDebug() << _url.path();
    QNetworkRequest request(_url);
    _manager.get(request);
    connect(&_manager, SIGNAL(finished(QNetworkReply*))
            , this, SIGNAL(finished(QNetworkReply*)));
Например, qDebug выдает "http://www.forum.crossplatform.ru/favicon.ico", а сама программа выдает вместо скачки ошибку 301(the Network Access API cannot honor the request because the protocol is not known), то есть протокол не известен, но как же он неизвестен, если выводиться http://...
Заранее спасибо!


Название: Re: Ошибка скачки файла
Отправлено: kambala от Июль 03, 2012, 14:00
у меня всё качается.

на всякий случай спрошу: соединить сигнал с сигналом – так и задумано?


Название: Re: Ошибка скачки файла
Отправлено: ruzik от Июль 03, 2012, 16:30
Да, так и задумано.
Странно, но у меня не качается, хотя должно.
Вот весь код класса:
Код:
#ifndef RFILEDOWNLOADER_H
#define RFILEDOWNLOADER_H
//--------Qt Headers
#include <QObject>
#include <QString>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>
//-------My and other headers
//-------
class RFileDownloader: public QObject
{
    Q_OBJECT
public:
    explicit RFileDownloader(QObject *parent = 0);
    explicit RFileDownloader(const QString &url = QString(), QObject *parent = 0);
    explicit RFileDownloader(const QUrl &url = QUrl(), QObject *parent = 0);
    ~RFileDownloader();
    //Url
    void setUrl(const QString &url) {_url = QUrl(url);}
    void setUrl(const QUrl &url) {_url = url;}
    QUrl url() const {return _url;}
private:
    QNetworkAccessManager _manager;
    QUrl _url;
public slots:
    void startDownloading(QUrl url = QUrl());
    void startDownloading(const QString &url);
signals:
    void finished(QNetworkReply *reply);
};

#endif // RFILEDOWNLOADER_H
Код:
//--------Qt Headers
#include <QNetworkRequest>
#include <QDebug>
//-------My and other headers
#include <Classes/RFileDownloader/RFileDownloader.h>
//-------

RFileDownloader::RFileDownloader(QObject *parent) : QObject(parent)
{}

RFileDownloader::RFileDownloader(const QString &url, QObject *parent) : QObject(parent)
{
    _url.setPath(url);
}

RFileDownloader::RFileDownloader(const QUrl &url, QObject *parent) : QObject(parent)
{
    _url = url;
}
RFileDownloader::~RFileDownloader()
{

}

void RFileDownloader::startDownloading(QUrl url)
{
    //If url is empty use _url
    if (!url.isEmpty())
        _url = url;
    qDebug() << _url.path();
    QNetworkRequest request(_url);
    _manager.get(request);
    connect(&_manager, SIGNAL(finished(QNetworkReply*))
            , this, SIGNAL(finished(QNetworkReply*)));
}

void RFileDownloader::startDownloading(const QString &url)
{
    QUrl urlForDownload;
    urlForDownload.setPath(url);
    startDownloading(urlForDownload);
}
Если вас не затруднит, не могли бы вы посмотреть код и сказать где еще может быть ошибка?
Использую класс примерно так:
Код:
            //Download icon from site
            _iconDownloader = new RFileDownloader("http://ru.wikipedia.org/favicon.ico", this);
            connect(_iconDownloader, SIGNAL(finished(QNetworkReply*)), this, SLOT(iconWasDownload(QNetworkReply*)));
            _iconDownloader->startDownloading();


Название: Re: Ошибка скачки файла
Отправлено: kambala от Июль 03, 2012, 17:54
я бы избавился от этого лишнего сигнала в классе и соединял бы напрямую с QNetworkAccessManager:
Код
C++ (Qt)
class RFileDownloader: public QObject
{
public:
   QNetworkAccessManager *netManager() { return &_manager; }
}
...
_iconDownloader = new RFileDownloader("http://ru.wikipedia.org/favicon.ico", this);
connect(_iconDownloader->netManager(), SIGNAL(finished(QNetworkReply*)), this, SLOT(iconWasDownload(QNetworkReply*)));
_iconDownloader->startDownloading();
да и слот бы назвал поправильнее – iconWasDownloaded.

в остальном вроде правильно, только как-то слишком наворочено конструкторов и перегруженных методов – думаю вполне можно обойтись лишь с одним параметром QUrl (при передаче строки будет автоматически создан объект типа QUrl), только у конструкторов придётся поубирать explicit.


Название: Re: Ошибка скачки файла
Отправлено: Alex Custov от Июль 03, 2012, 19:10
Прочитай документацию на QUrl::setPath()


Название: Re: Ошибка скачки файла
Отправлено: ruzik от Июль 03, 2012, 20:06
Цитировать
только у конструкторов придётся поубирать explicit.
Вы не правы, explicit запрещает создание подобных вещей:
Код:
RFileDowloader down = "asdf.com"
, но не подобных:
Код:
RFileDowloader down("asdf.com")
Alex Custov, вы оказались правы: все дело было в path().
Alex Custov и kambala, большое вам спасибо за помощь!