© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
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
И в конце статьи есть тот же самый список дополнительно рекомендуемых статей

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

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
15 июня 2018 г. 12:42
Nicky

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат 100 баллов
  • Очки рейтинга 10
15 июня 2018 г. 12:36
Nicky

C++ - Тест 003. Условия и циклы

  • Результат 57 баллов
  • Очки рейтинга -2
15 июня 2018 г. 12:29
Nicky

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

  • Результат 46 баллов
  • Очки рейтинга -6
Последние комментарии
18 июня 2018 г. 7:12
EVILEG

PyQt5 - Урок 007. Работаем с QML QtQuick (Сигналы и слоты)

Я вот сейчас банальность скажу, но у меня всё работало. Так что даже и не знаю, надо на код смотреть, что ещё у вас добавлено или отсутствует из библиотек. P/S/ Извините, вы сейчас вс...
18 июня 2018 г. 7:10
EVILEG

Qt/C++ - Урок 042. PopUp уведомление в стиле Gnome с помощью Qt

Недоработки, вряд ли этот зверь вообще является официально поддерживаемым
18 июня 2018 г. 7:01
EVILEG

QML - Урок 016. База данных SQLite и работа с ней в QML Qt

что-то мне сдаётся, что здесь просто пересобрать проект нужно с удалением build каталога
18 июня 2018 г. 7:00
EVILEG

Qt - WinAPI. Как показать запущенное приложение поверх своего приложения

Если зарыться в API системы, то, думаю, что можно, тут тоже использовался WinAPI.
16 июня 2018 г. 15:19
pro100belik

Qt - WinAPI. Как показать запущенное приложение поверх своего приложения

А можно по ID процесса  выводить на передний план окно? myProcess->processId();
Сейчас обсуждают на форуме
19 июня 2018 г. 7:56
EVILEG

как редактировать порядок обхода этементов по нажатию TAB в Qt5 qml

Что-то наподобие такого TextField { Keys.onReturnPressed: nextItemInFocusChain().forceActiveFocus()}
19 июня 2018 г. 6:31
kabanov

Как сохранить фокус в TextField после перезагрузки модели

Rectangle { ListView { id: listView delegate: Item { id: cDelegate Item { Row { ComboBox { ...
18 июня 2018 г. 10:51
alex_lip

Qml and JavaScript

В том то и дело что просто в JS так нельзя Если использовать state - onReleased - не нужен вот так все работает Text { ...
18 июня 2018 г. 7:16
EVILEG

почему не выполняется код после вызова слота?

в рамках какого кода, из вашего вопроса не понятно, к чему вы задали этот вопрос и к чему это относится. Если мне ещё ясно, к какой статье этот вопрос был задан, поскольку я слежу за всем ре...

Рекомендуемые страницы