没有调用QNetworkAccessManager完成信号的插槽

时间:2015-02-10 10:23:59

标签: qt qnetworkaccessmanager qt-signals qnetworkreply

我想向服务器发送一个帖子请求,我这样做:

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();
}

2 个答案:

答案 0 :(得分:0)

您需要告诉Qt将finished()完成时调用的信号post()连接到您选择的插槽。如下所示:

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

有关信号和广告位的详细信息,请参阅this page

答案 1 :(得分:0)

好的,所以我发现了我的错误!你可以按照你想要的答案或问题进行投票,但我想回答其他人是否有类似的问题!

小心!具有槽的对象应在范围内,并且在调用槽之前不终止(销毁)。正如您在我的问题的编辑部分中所看到的,对象已创建,它调用一个函数,然后它超出了范围!

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