使用QtSoap lib在Qt中考虑以下内容:
QtSoapHttpTransport http;
http.setHost("XXXX",3333);
connect(&http, SIGNAL(responseReady()), this, SLOT(getResponse()));
现在我想要调用的方法是:
QtSoapMessage request;
request.setMethod("test");
request.addMethodArgument("xxx","zzzz",xxx);
request.addMethodArgument("xx","xx",xx);
http.submitRequest(Request, "/api/soap");
现在我想要这样的东西:
QString GetTest(){
while(http.isBusy); // no such a thing as isbusy
return http.getResponse().returnValue().toString();}
或我可以用来获取返回值或等待它并获得它的任何技术..
提前致谢...
答案 0 :(得分:-1)
我没有看到问题。 QtSoapHttpTransport
reference已经有了一个很好的简单示例。
如果你想要一个只在收到响应时阻止并返回的getter,那么进行主动等待(你的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文档中一样。