Russian Qt Forum
Ноябрь 23, 2024, 18:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка скачки файла  (Прочитано 4393 раз)
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://...
Заранее спасибо!
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июль 03, 2012, 14:00 »

у меня всё качается.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ruzik
Гость
« Ответ #2 : Июль 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();
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июль 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.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Июль 03, 2012, 19:10 »

Прочитай документацию на QUrl::setPath()
Записан
ruzik
Гость
« Ответ #5 : Июль 03, 2012, 20:06 »

Цитировать
только у конструкторов придётся поубирать explicit.
Вы не правы, explicit запрещает создание подобных вещей:
Код:
RFileDowloader down = "asdf.com"
, но не подобных:
Код:
RFileDowloader down("asdf.com")
Alex Custov, вы оказались правы: все дело было в path().
Alex Custov и kambala, большое вам спасибо за помощь!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.212 секунд. Запросов: 23.