Russian Qt Forum

Qt => Работа с сетью => Тема начата: spirits25 от Ноябрь 15, 2012, 17:06



Название: Проблема с QNetworkAccessManager
Отправлено: spirits25 от Ноябрь 15, 2012, 17:06
Использую Qt5. Необходимо скачивать небольшие картинки по прямой ссылке.
В конструкторе:
Код:
    manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
            SLOT(downloadFinished(QNetworkReply*)));
Метод, который вызываю из кода:
Код:
void MyDownloader::doDownload(const QString &path)
{
    QUrl url = QUrl(path);
    url.setScheme("http");
    QNetworkRequest request(url);
    QNetworkReply *reply = manager->get(request);
}

И СЛОТ, вызываемый коннектом:
Код:
void MyDownloader::downloadFinished(QNetworkReply *reply)
{
    qDebug() << "trololo";
}

Проблема в том, что метод downloadFinished не вызывается. видимо по тому, что сигнал finished от объекта manager не поступает.
Что делать?
Спасибо=)


Название: Re: Проблема с QNetworkAccessManager
Отправлено: Bepec от Ноябрь 15, 2012, 17:18
А ты ошибку поймай от него же. И скорее всего у тебя URL получается неверный. (% на 30 уверен)


Название: Re: Проблема с QNetworkAccessManager
Отправлено: spirits25 от Ноябрь 15, 2012, 18:14
А ты ошибку поймай от него же. И скорее всего у тебя URL получается неверный. (% на 30 уверен)

А как это сделать? он просто проходит дальше, ничего не говоря. У него из сигналов только sslErrors подходит, но у меня ведь не ssl.


Название: Re: Проблема с QNetworkAccessManager
Отправлено: spirits25 от Ноябрь 15, 2012, 18:21
из qt4 пример /usr/share/qt4/examples/network/download/ работает, даже если с библиотеками qt5 собираю, значит у меня ошибка. Спасибо.


Название: Re: Проблема с QNetworkAccessManager
Отправлено: Bepec от Ноябрь 15, 2012, 19:11
Эммм... возьми нетворк манагер. У него есть сигнал ошибочный.

Не вызывается?
Тогда берём reply от get и смотрим у него url. Проверяем - пытаемся скачать по прямой, нормальной ссылке засунутой в QUrl.

Не работает?
Не может быть :D


Название: Re: Проблема с QNetworkAccessManager
Отправлено: Kolobok от Ноябрь 15, 2012, 19:42
void QNetworkReply::error ( QNetworkReply::NetworkError code ) [signal]

посмотри, что он шлет.


Название: Re: Проблема с QNetworkAccessManager
Отправлено: spirits25 от Ноябрь 16, 2012, 11:32
Эммм... возьми нетворк манагер. У него есть сигнал ошибочный.

Не вызывается?
Тогда берём reply от get и смотрим у него url. Проверяем - пытаемся скачать по прямой, нормальной ссылке засунутой в QUrl.

Не работает?
Не может быть :D

Код:
QNetworkReply *reply = manager.get(request);
qDebug() << reply->url();
Цитировать
QUrl( "http://freebieblog.ru/uploads/posts/2012-02/1329145302_8a7e8cf5e00439e3565873583c32c7c9_full.jpeg" )

Но
Код:
connect(&manager, SIGNAL(finished(QNetworkReply*)),
            SLOT(downloadFinished(QNetworkReply*)));
connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslErrors(QList<QSslError>)));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(testSlot(QNetworkReply::NetworkError)));
Ни один слот ничего не выводит (в начале каждого qDebug()).


Название: Re: Проблема с QNetworkAccessManager
Отправлено: Bepec от Ноябрь 16, 2012, 11:37
Вы хотите чтобы я написал пример для проверки работоспособности ?

PS в принципе то могу.


Название: Re: Проблема с QNetworkAccessManager
Отправлено: spirits25 от Ноябрь 16, 2012, 11:48
Вы хотите чтобы я написал пример для проверки работоспособности ?

PS в принципе то могу.

Я ведь писал выше
Цитировать
из qt4 пример /usr/share/qt4/examples/network/download/ работает, даже если с библиотеками qt5 собираю, значит у меня ошибка. Спасибо.

Пытаюсь сейчас сам разобраться, спасибо за помощь.


Название: Re: Проблема с QNetworkAccessManager
Отправлено: spirits25 от Ноябрь 16, 2012, 11:57
Кажется понимаю причину, но не пойму почему это так влияет.
В примере qt4/examples/network/download всё находится в одном файле и работает. Я перемещаю в отдельный .h файл - получаю много "qt multiple definition" - на каждый метод по два раза.
Перемещаю реализацию методов в .cpp - вызываются все, кто тех, что должны по сигналу (указанные слоты в connect) вызываться.

Почему так, я не знаю=)


Название: Re: Проблема с QNetworkAccessManager
Отправлено: Bepec от Ноябрь 16, 2012, 12:40
вызываются все, кто тех, что должны по сигналу (указанные слоты в connect) вызываться.
Зачётная фраза. Сами то поймёте?

Выкиньте проект и я укажу вам ошибку.


Название: Re: Проблема с QNetworkAccessManager
Отправлено: spirits25 от Ноябрь 16, 2012, 13:15
вызываются все, ктоме тех, что должны по сигналу (указанные слоты в connect) вызываться.
Или опечатался или беспроводная клава глючит (она это любит делать=)).


Название: Re: Проблема с QNetworkAccessManager
Отправлено: Bepec от Ноябрь 16, 2012, 13:18
ктоме :D Выложите проект и в течении 4-10 минут я найду очевидные ошибки :D неочевидные не найду, но попытаюсь :D


Название: Re: Проблема с QNetworkAccessManager
Отправлено: spirits25 от Ноябрь 16, 2012, 13:57
ктоме :D Выложите проект и в течении 4-10 минут я найду очевидные ошибки :D неочевидные не найду, но попытаюсь :D

Вот так заработало - отдельный метод, в котором:
Код:
    QUrl url = QUrl::fromEncoded(path.toLocal8Bit());
    QNetworkAccessManager m;
    QNetworkReply * reply = m.get( QNetworkRequest( url ) );
    QEventLoop loop;
    connect( reply, SIGNAL(finished()), &loop, SLOT(quit()) );
    loop.exec();
    QString _filepath = "/tmp/3.png";
    QString filepath(_filepath);

    if (QFile::exists(filepath))
    {
        return filepath;
    }

    qDebug() << "filepath" << filepath;
    if ( reply->error() == QNetworkReply::NoError )
    {
      QFile image( filepath );
      image.open(QIODevice::WriteOnly);
      image.write( reply->readAll() );
      image.close();
    }
    else
    {
    }
    return filepath;


Название: Re: Проблема с QNetworkAccessManager
Отправлено: Bepec от Ноябрь 16, 2012, 14:06
Ну и хорошо, только это не очень правильно. У вас цикл там крутиться, соответственно распараллелить не получится.

Ну да в принципе, если так и нужно, то в путь.


Название: Re: Проблема с QNetworkAccessManager
Отправлено: spirits25 от Ноябрь 16, 2012, 14:55
Ну и хорошо, только это не очень правильно. У вас цикл там крутиться, соответственно распараллелить не получится.

Ну да в принципе, если так и нужно, то в путь.

нет, так не нужно=)

Сделал из примера qt4 download - работает, точно так же перенёс в свой проект (проект большой, так тут не выложу) - перестаёт загружать. всё в точности скопировал. Единственная разница в том, что в первом случае было в функции main:
Код:
    QCoreApplication app(argc, argv);

    Downloader manager;
    manager.setParameters(1, 1, 1);
    QTimer::singleShot(0, &manager, SLOT(execute()));

    app.exec();
А во втором у меня QApplication и код:
Код:
Downloader manager;
manager.setParameters(cur_zoom, separation-slice_num-1, stack_num);
QTimer::singleShot(0, &manager, SLOT(execute()));
вызывается внутри моего класса.

PS: Оба проекта компилирую с Qt5 библиотеками, файлы класса Downloader .h и .cpp идентичны. Во втором случае не работает=(


Название: Re: Проблема с QNetworkAccessManager
Отправлено: Bepec от Ноябрь 16, 2012, 15:14
manager.setParameters(cur_zoom, separation-slice_num-1, stack_num); Ху из дыс.

PS мне уже надоело в телепата играть. Не тот день недели.


Название: Re: Проблема с QNetworkAccessManager
Отправлено: spirits25 от Ноябрь 16, 2012, 15:23
manager.setParameters(cur_zoom, separation-slice_num-1, stack_num); Ху из дыс.

PS мне уже надоело в телепата играть. Не тот день недели.

Просто три числа int.
Согласен, день не тот. Думаю в поток предыдущий рабочий вариант вынесу и буду его добивать=)