13 ноября 2017 г. 13:48

Опять NetworkAccessManager

Все пытаюсь выполнить два запроса в одной сессии. Мне нужно обработать два replay от одного accessmanager. Как мне правильно описать функцию onResult и ее вызвать в этой конструкции

connect(replay,QNetworkReply::finished,this,AppCore::onResult(QNetworkReply *reply));
Вы говорили что писать SIGNAL() и SLOT() - нехорошо. Я опять запутался.



 networkManager = new QNetworkAccessManager();
      url = server_ip_loc+"search/sea/"+text;
      url_context =server_ip_loc+"in_put/set_cont";
      QNetworkRequest request( url_context );
      request.setHeader( QNetworkRequest::ContentTypeHeader, "application/json" );
        QJsonObject json
            {
                {"id", user_id}
            };
    QEventLoop loop;
    QNetworkReply* replay_cont =  networkManager->post(request, QJsonDocument(json).toJson());
    QObject::connect(replay_cont,&QNetworkReply::finished,&loop,&QEventLoop::quit);
    loop.exec();
    QNetworkReply *replay =  networkManager->get(QNetworkRequest(QUrl(url)));
connect(replay,QNetworkReply::finished,this,AppCore::onResult(QNetworkReply *reply));

И как выставить QNetworkConfigurationManager::NetworkSessionRequired тоже непонятно. Везде в примерах ну очень муторно!

Я бы подключился как обычно, также к QNetworkAccessManager`у вместо QNetworkReply.

connect(networkManager,QNetworkManager::finished,this,AppCore::onResult);
А вот второй запрос
QNetworkReply *replay =  networkManager->get(QNetworkRequest(QUrl(url)));
выполнил бы уже в методе onResult()

Просто нужно определить какой запрос в данный момент выполняется. Можно сделать некую переменную, которая будет содержать текузее состояние. Например, что это идёт POST запрос, а как только пришёл исправный ответ, то поменять эту переменную и выполнить GET запрос.

Что касается нового синтаксис сигналов и слотов, то я накидал заметку на эту тему .

С QNetworkConfigurationManager пока не подскажу, смотреть нужно. Но сделайте для начала последовательный вызов запросов. Первый запрос как обычно вызываете, а второй уже в методе onResult, в том случае, если первый выполнился исправно.


Пробовал  - плохо получается. С LOOP хотя бы последовательность есть. Там железно сначала один идет запрос , потом другой.

Object::connect(replay_cont,&QNetworkReply::finished,&loop,&QEventLoop::quit);

В любом случае, ответ нужно принимать через метод finished у QNetworkAccessManager.

connect(networkManager,QNetworkManager::finished,this,AppCore::onResult);
Используйте переменную в классе для определения того, какой сейчас запрос необходимо обработать. И через условие if-else выбирайте обработчик, который будет актуален для текущего запроса в метода onResult .

По окончании первого запроса после строки
loop.exec();
Устанавливайте переменную на обработку второго запроса.
Переменная в данном случае будет представлять из себя что-то вроде флага, который будет указывать на то, какой сейчас запрос нужно обработать.

А почему нельзя вешать на replay?

        QNetworkRequest webservice1Request;
        // @todo setup webservice1Request.
        QNetworkReply * const reply1 = networkAccessManager->get(webservice1Request);
        connect(reply1, QNetworkReply::finished, this, MyClass::getUserName);

        QNetworkRequest webservice2Request;
        // @todo setup webservice2Request.
        QNetworkReply * const reply2 = networkAccessManager->get(webservice2Request);
        connect(reply2, QNetworkReply::finished, this, MyClass::getUserAddress);

Да в принципе можно, только Вам тогда нужно сделать замыкание через лямбду на этот reply, чтобы из него брать ответную информацию. А networkManager возвращает текущий ответ.

Хотя я решил вопрос на стороне сервера ))). Просто SQL View по другому сделал. Без контекста. Но теоретически все равно интересно.  Где надо принимать ответ через NetworkManager, а где через NetworkReplay. В книжке Макса Шлее написано, что как раз QNetworkReplay содержит данные ответа.

И все-таки где сессия начинается и где заканчивается?

PS. Ваша заметка про синтаксис сигналов и слотов хороша, но она скорее для продвинутых. Вот здесь немного проще - https://habrahabr.ru/post/141983/ - может быть добавите пару абзацев сначала для начинающих.

  • alex_lip
  • #
  • отредактировано 14 ноября 2017 г. 9:08
  • 14 ноября 2017 г. 9:05

Уже давно всё есть на сайте про сигналы и слоты:

  1. Сигналы и слоты
  2. Перегрузка сигналов и слотов
  3. Сигналы и слоты в Qt QML
  4. Сигналы и слоты в PyQt5
И в конце статьи есть тот же самый список дополнительно рекомендуемых статей

Извините пожалуйста. Не увидел.  Очень сложно всю необходимую матчасть прочитать когда работаешь и по работе тебе это в принципе не нужно. Я для себя придумал задачу и пытаюсь ее написать. Буду изучать. Спасибо.

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
22 февраля 2018 г. 18:58
Oleg_kgd

C++ - Тест 001. Первая программа и типы данных

  • Результат 66 баллов
  • Очки рейтинга -1
21 февраля 2018 г. 19:18
sentinel

Qt - Тест 001. Сигналы и слоты

  • Результат 78 баллов
  • Очки рейтинга 2
21 февраля 2018 г. 11:32
barilla

C++ - Тест 006. Перечисления

  • Результат 0 баллов
  • Очки рейтинга -10
Последние комментарии
22 февраля 2018 г. 16:42
soz7557

Qt/C++ - Урок 029. Изображение в базе данных в Qt – Сохранение и Восстановление

Hi, could you please show how to delete file from image Blob?  also if the same image exist in Blob then don't over write..

21 февраля 2018 г. 8:37
EVILEG

Qt/C++ - Урок 027. Полиморфизм в Qt на примере геометрических фигур в QGraphicsScene

Добрый день! 1) Эллипс можно реализовать так void Ellipse::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){ painter->setPen(QPen(...

20 февраля 2018 г. 22:10
Log159

Qt/C++ - Урок 027. Полиморфизм в Qt на примере геометрических фигур в QGraphicsScene

Здравствуйте! В программировании новичок и есть пара вопросов. Буду очень благодарен за ответ. Не совсем понимаю как: 1) реализовать подобным образом рисование эллипса(конкре...

18 февраля 2018 г. 14:42
EVILEG

QML - Урок 019. Navigation Drawer в Qt Qml Android

Да, теперь представляю, как то работает. Согласен, ваша правка определённо к месту здесь.

Сейчас обсуждают на форуме
21 февраля 2018 г. 22:19
vitaliy_antipov

Проблема с ComboBox

Спасибо за ответы, есть над чем подумать

21 февраля 2018 г. 13:26
sol11

Qtableviev после сортировки

Спасибо, всё заработало :) Единственное вот тут row на id поменял и всё круто :)) if(id == -1){ model->insertRow(model->rowCount(QModelIndex())); map...

20 февраля 2018 г. 13:18
alex_lip

Разбить один qml файл на несколько составляющих

Да спасибо. Просто после необходимости специфичных названий для файла - стараюсь обращать внимание на любую мелочь.

20 февраля 2018 г. 8:13
EVILEG

Передача файлов в django минуя временные папки django и nginx

Тогда я даже и не знаю, прошерстил документацию, но там нет информармации о возможности отключения сохранения временных файлов. Как я понял временные файлы используются, когда тело запро...

18 февраля 2018 г. 12:34
EVILEG

QGraphicsView

Добрый день!QGraphicsView - это виджет, а значит, что в качестве парента для него выступает QWidget, а не QObject.То есть из ошибок, которые сразу бросаются в глаза в этом коде, здесь прису...