Получить функцию, которая инициировала QNetworkRequest в replyFinished () - PullRequest
6 голосов
/ 19 марта 2011

У меня следующая проблема:

У меня есть класс Foo, который инкапсулирует веб-API. интерфейс имеет следующие функции:

Foo :: addItem (идентификатор QString)
Foo :: updateItem (идентификатор QString)

Обе функции инициируют QNetworkRequest с тем же URL , но использование данных отличается. Поэтому мне нужно знать в слоте функцию Foo :: replyFinished (QNetworkReply * wf_reply) , откуда возникла QNetworkRequest.

Как бы вы решили это?

Я мог бы использовать переменную для хранения адреса QNetworkRequest, чтобы сравнить его позже с wf_reply-> request (), но мне это кажется хаком. Учитывая, что вы можете вызывать addItem () или updateItem () сто раз, прежде чем replyFinished () будет выполнен в первый раз. Лучше всего добавить строку или целое число в QNetworkRequest, который содержит имя или идентификатор функции.

Ответы [ 2 ]

3 голосов
/ 19 марта 2011

В вашем оригинальном QNetworkRequest вы можете установить атрибут с помощью

setAttribute(Attribute code, const QVariant & value)

Attribute - это перечисление, и для этой ситуации есть зарезервированный код, QNetworkRequest::User. (См .: Атрибут )

В вашем QNetworkReply вы можете потянуть QNetworkRequest с помощью request(), а затем получить Attribute оттуда с attribute()

Немного взломать, но я думаю, что это должно работать.

0 голосов
/ 21 марта 2011

У вас есть четыре варианта:

  1. Соединение void QNetworkReply::finished() сигнал каждого ответа, который вы создаете с помощью одной из ваших функций, обрабатывающих запросы определенного типа
  2. Используйте setAttribute () в QNetworkRequest, как предложено Брайаном
  3. Используйте void QNetworkRequest::setOriginatingObject(QObject * object), который был добавлен только для этой цели. Проблема в вашей ситуации заключается в том, что оба типа ваших запросов исходят из одного и того же объекта QObject. Вы можете создать два фиктивных объекта QObject только для того, чтобы отправить их адреса для маркировки запросов, или вы можете использовать reinterpret_cast для передачи вида запроса в качестве указателя.
  4. Отслеживайте инициированные запросы самостоятельно, как вы предлагали. Поскольку за один раз может быть активным любое количество запросов, вам придется использовать два списка указателей (по одному для каждого вида запросов), например
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...