2015-02-10 4 views
-1

Я хочу отправить пост запрос на сервер, и я сделать что-то вроде этого:Слот не вызывается для сигнала закончил из 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 для отслеживания запроса/ответа, и я обнаружил, что запрос (сообщение) отправляется, и сервер возвращает ответ со статусом 200 (ok). Также переменная ret возвращает true, то есть соединение между сигналом и слотом было успешно выполнено. У любого из вас есть идея, почему это не работает? Спасибо :)

EDIT

Код, который вызывает проблему - см мой ответ - это:

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

Это все ваш код? У вас нет CONNECT (...) для подключения сигнала к слоту? – PureW

+0

Если вы прочтете код, вы увидите его там! Благодаря! :) –

ответ

0

Хорошо, поэтому я нашел свою ошибку! Вы можете уменьшить так, как хотите, мой ответ или вопрос, но я хотел бы ответить, если у кого-то есть аналогичная проблема!

Будьте осторожны! Объект, имеющий слот, должен быть в области действия и не заканчиваться (уничтожаться) до вызова слота. Как вы можете видеть в отредактированной части моего вопроса, объект создан, он вызывает функцию, а затем выходит за рамки!

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

Рад, что это сработало. Я собирался спросить, где вы определили свой сервисRequestFinished (...) – PureW

0

Вы должны сказать Qt для подключения сигнала finished(), который когда post() заканчивается, в слот по вашему выбору. Что-то вроде следующего:

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

Для получения дополнительной информации о сигналах и слотах см this page.