未调用 QNetworkAccessManager 信号完成的插槽
Slot not called for signal finished of QNetworkAccessManager
我想向服务器发送 post 请求,我这样做了:
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 来跟踪 request/response,我发现请求(post)正在发送并且服务器 returns 返回状态为 200
(好的)。还有 ret
变量 returns true
,即信号和槽之间的连接成功。你们中有人知道为什么这不起作用吗?谢谢!:)
编辑
导致问题的代码——看我的回答——是这样的:
{
MyObjectWithSlot obj;
obj.makePost();
}
您需要告诉 Qt 将在 post()
完成时调用的信号 finished()
连接到您选择的插槽。类似于以下内容:
QObject::connect(networkManager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
有关信号和槽的详细信息,请参阅 this page。
好的,我发现我的错误了!您可以根据需要对我的回答或问题投反对票,但如果其他人有类似问题,我想回答!
小心!具有插槽的对象应该在范围内,而不是在调用插槽之前终止(销毁)。正如您在我的问题的编辑部分中看到的那样,创建了对象,它调用了一个函数,然后它超出了范围!
{
MyObjectWithSlot obj;
return obj.makePost();
}
我想向服务器发送 post 请求,我这样做了:
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 来跟踪 request/response,我发现请求(post)正在发送并且服务器 returns 返回状态为 200
(好的)。还有 ret
变量 returns true
,即信号和槽之间的连接成功。你们中有人知道为什么这不起作用吗?谢谢!:)
编辑
导致问题的代码——看我的回答——是这样的:
{
MyObjectWithSlot obj;
obj.makePost();
}
您需要告诉 Qt 将在 post()
完成时调用的信号 finished()
连接到您选择的插槽。类似于以下内容:
QObject::connect(networkManager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
有关信号和槽的详细信息,请参阅 this page。
好的,我发现我的错误了!您可以根据需要对我的回答或问题投反对票,但如果其他人有类似问题,我想回答!
小心!具有插槽的对象应该在范围内,而不是在调用插槽之前终止(销毁)。正如您在我的问题的编辑部分中看到的那样,创建了对象,它调用了一个函数,然后它超出了范围!
{
MyObjectWithSlot obj;
return obj.makePost();
}