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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Проблема с QNetworkAccessManager  (Прочитано 12000 раз)
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 не поступает.
Что делать?
Спасибо=)
Записан
Bepec
Гость
« Ответ #1 : Ноябрь 15, 2012, 17:18 »

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

А ты ошибку поймай от него же. И скорее всего у тебя URL получается неверный. (% на 30 уверен)

А как это сделать? он просто проходит дальше, ничего не говоря. У него из сигналов только sslErrors подходит, но у меня ведь не ssl.
Записан
spirits25
Гость
« Ответ #3 : Ноябрь 15, 2012, 18:21 »

из qt4 пример /usr/share/qt4/examples/network/download/ работает, даже если с библиотеками qt5 собираю, значит у меня ошибка. Спасибо.
Записан
Bepec
Гость
« Ответ #4 : Ноябрь 15, 2012, 19:11 »

Эммм... возьми нетворк манагер. У него есть сигнал ошибочный.

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

Не работает?
Не может быть Веселый
Записан
Kolobok
Гость
« Ответ #5 : Ноябрь 15, 2012, 19:42 »

void QNetworkReply::error ( QNetworkReply::NetworkError code ) [signal]

посмотри, что он шлет.
Записан
spirits25
Гость
« Ответ #6 : Ноябрь 16, 2012, 11:32 »

Эммм... возьми нетворк манагер. У него есть сигнал ошибочный.

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

Не работает?
Не может быть Веселый

Код:
QNetworkReply *reply = manager.get(request);
qDebug() << reply->url();
Цитировать

Но
Код:
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()).
Записан
Bepec
Гость
« Ответ #7 : Ноябрь 16, 2012, 11:37 »

Вы хотите чтобы я написал пример для проверки работоспособности ?

PS в принципе то могу.
Записан
spirits25
Гость
« Ответ #8 : Ноябрь 16, 2012, 11:48 »

Вы хотите чтобы я написал пример для проверки работоспособности ?

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

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

Пытаюсь сейчас сам разобраться, спасибо за помощь.
Записан
spirits25
Гость
« Ответ #9 : Ноябрь 16, 2012, 11:57 »

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

Почему так, я не знаю=)
Записан
Bepec
Гость
« Ответ #10 : Ноябрь 16, 2012, 12:40 »

вызываются все, кто тех, что должны по сигналу (указанные слоты в connect) вызываться.
Зачётная фраза. Сами то поймёте?

Выкиньте проект и я укажу вам ошибку.
Записан
spirits25
Гость
« Ответ #11 : Ноябрь 16, 2012, 13:15 »

вызываются все, ктоме тех, что должны по сигналу (указанные слоты в connect) вызываться.
Или опечатался или беспроводная клава глючит (она это любит делать=)).
Записан
Bepec
Гость
« Ответ #12 : Ноябрь 16, 2012, 13:18 »

ктоме Веселый Выложите проект и в течении 4-10 минут я найду очевидные ошибки Веселый неочевидные не найду, но попытаюсь Веселый
Записан
spirits25
Гость
« Ответ #13 : Ноябрь 16, 2012, 13:57 »

ктоме Веселый Выложите проект и в течении 4-10 минут я найду очевидные ошибки Веселый неочевидные не найду, но попытаюсь Веселый

Вот так заработало - отдельный метод, в котором:
Код:
    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;
Записан
Bepec
Гость
« Ответ #14 : Ноябрь 16, 2012, 14:06 »

Ну и хорошо, только это не очень правильно. У вас цикл там крутиться, соответственно распараллелить не получится.

Ну да в принципе, если так и нужно, то в путь.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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