Я не вижу проблемы.QtSoapHttpTransport
ссылка уже имеет хороший простой пример.
Если вы хотите получить метод получения, блокирующий и возвращающий только при получении ответа, выполняйте активное ожидание (ваш цикл while)это абсолютно не тот путь.
Вы уже подключили сигнал responseReady
к своему слоту, поэтому единственное, чего не хватает, это иметь точку синхронизации, которая блокирует ваш поток, вызывающий getTest
, пока этот слот не будетВыполнено.
class Messenger : public QObject {
Q_OBJECT
public:
Messenger() { /* ... your initialization code with connect ... */ }
void sendRequest() { /* ... your sending code ... */ }
QString getTest() // call this from a worker thread to wait
{ // for a response to arrive and retrieve it
QMutexLocker lock(&responseMutex);
responseReady.wait(&responseMutex);
return http.getResponse().returnValue().toString();
}
public slots:
void getResponse() { // slot called by Qt event loop when response arrives
responseReady.wakeAll();
}
private:
QtSoapHttpTransport http;
QWaitCondition responseReady;
QMutex responseMutex;
};
Обратите внимание, что этот дизайн имеет смысл, только если у вас есть многопоточное приложение, а поток, вызывающий getTest
, является рабочим потоком, а не потоком, управляемым событиями.
Вс другой стороны, если ваше приложение просто хочет сделать что-то с полученным ответом, нет никаких причин, по которым вам в первую очередь нужен метод блокировки.Просто выполняйте свои действия непосредственно в слоте - как в документации по Qt.