2015-02-10 88 views
-1

我想发送POST请求到服务器,并且我做这样的事情:插槽不叫信号完成QNetworkAccessManager

function makePost(){ 
    QNetworkAccessManager *networkManager = new QNetworkAccessManager(); 

    qDebug()<<"1"; 
    bool ret = connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*))); 
    qDebug()<<"2: " <<ret; 

    QUrl serviceUrl = QUrl("http://someurl/json"); 
    QNetworkRequest request(serviceUrl); 
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); 

    QString content = ""; 
    networkManager->post(request, content.toUtf8()); 
} 

但插槽serviceRequestFinished()完全不叫!我必须提到,我使用Wireshark来跟踪请求/响应,并且我发现请求(post)正在发送,并且服务器返回状态为200(ok)的响应。此外,ret变量返回true,即信号和时隙之间的连接已成功完成。你们中的任何人都有任何想法,为什么这不起作用?谢谢:)

编辑

导致该问题的代码 - 见我的答案 - 是这样的:!

{  
    MyObjectWithSlot obj; 
    obj.makePost(); 
} 
+0

那是你所有的代码吗?您没有CONNECT(...)将信号连接到插槽? – PureW 2015-02-10 13:48:26

+0

如果您阅读代码,您会看到一个连接!谢谢! :) – 2015-02-11 09:47:35

回答

0

好吧,我发现我的错误!您可以尽可能减少您的答案或问题,但我想回答是否有其他人遇到类似的问题!

小心!具有插槽的对象应该在作用域内,而不是在插槽被调用之前终止(销毁)。正如你可以在我的问题的编辑部分看到的那样,该对象被创建,它调用一个函数,然后它超出了范围!

{ 
    MyObjectWithSlot obj; 
    return obj.makePost(); 
} 
+0

很高兴它的工作。我正要问你在哪里定义了你的serviceRequestFinished(...) – PureW 2015-02-11 09:54:51

0

你需要告诉Qt来连接信号finished(),这是在post()完成时调用,以便您选择一个插槽。类似如下:

QObject::connect(networkManager, SIGNAL(finished(QNetworkReply*)), 
       this, SLOT(replyFinished(QNetworkReply*))); 

有关信号和插槽的更多信息,请参阅this page