Название: Ошибка скачки файла
Отправлено: 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();
да и слот бы назвал поправильнее – iconWasDownload ed. в остальном вроде правильно, только как-то слишком наворочено конструкторов и перегруженных методов – думаю вполне можно обойтись лишь с одним параметром 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, большое вам спасибо за помощь!
|