【问题标题】:Slot not called for signal finished of QNetworkAccessManager插槽未调用 QNetworkAccessManager 的信号完成
【发布时间】:2015-02-10 10:23:58
【问题描述】:

我想向服务器发送一个发布请求,我做了这样的事情:

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 跟踪请求/响应,我发现请求(发布)正在发送,服务器返回状态为 200(ok) 的响应。同样ret 变量返回true,即信号和槽之间的连接成功。你们中的任何人都知道为什么这不起作用吗?谢谢!:)

编辑

导致问题的代码 - 请参阅我的答案 - 是这样的:

{    
     MyObjectWithSlot obj;
     obj.makePost();
}

【问题讨论】:

  • 这就是你的全部代码吗?您没有 CONNECT(...) 将信号连接到插槽?

标签: qt qnetworkaccessmanager qt-signals qnetworkreply


【解决方案1】:

好的,我发现了我的错误!您可以根据需要对我的回答或问题投反对票,但如果其他人有类似问题,我想回答!

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

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

【讨论】:

  • 很高兴它成功了。我正要问你在哪里定义你的 serviceRequestFinished(...)
【解决方案2】:

您需要告诉 Qt 将信号 finished()(在 post() 完成时调用)连接到您选择的插槽。类似于以下内容:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多