2009-12-24 8 views
1

J'essaye d'écrire une application en utilisant QNetworkManager. J'ai simplifié le code au problème. Le code suivant se bloque, et je ne sais pas pourquoi:Qt4 QNetworkManager se bloque

main.cpp:

#include <QApplication> 
#include "post.h" 

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 
    post("http://google.com/search", "q=test"); 
    return app.exec(); 
} 

post.h:

#ifndef _H_POST 
#define _H_POST 

#include <QNetworkAccessManager> 
#include <QNetworkRequest> 

class post : public QObject { 
    Q_OBJECT 

    public: 
     post(QString URL, QString data); 

    public slots: 
     void postFinished(QNetworkReply* reply); 

    protected: 
     QNetworkAccessManager *connection; 

}; 

#endif 

post.cpp:

#include <QApplication> 
#include <QUrl> 
#include "post.h" 

post::post(QString URL, QString data) { 
    connection = new QNetworkAccessManager(this); 
    connect(connection, SIGNAL(finished(QNetworkReply*)), this, SLOT(postFinished(QNetworkReply*))); 
    connection->post(QNetworkRequest(QUrl(URL)), data.toAscii()); 
} 

void post::postFinished(QNetworkReply*) { 
    qApp->exit(0); 
} 

Certains Googling montre que c'est peut-être parce que j'ai tout sur un thread, mais je n'ai aucune idée de comment changer cela dans Qt ... aucun des exemples de réseau sh ow ça.

+0

Est-ce qu'il se bloque dans connect-> post ou dans app.exec? –

+0

app.exec il semble que post :: postFinished ne soit jamais appelé – singpolyma

+0

Quelle version de Qt courez-vous? –

Répondre

4

Je viens de l'essayer avec les mêmes résultats. Le problème est que vous créez l'objet de publication en appelant uniquement le constructeur. Puisque vous ne spécifiez pas un objet, il est tout de suite se détruit (pour vérifier cela crée un destructor et voir quand il est appelé.)

essayer:

post p("http://google.com/search","q=test"); 

Ensuite, votre emplacement est appelée.

+0

C'est un pointeur valide, et -> rawHeaderList() renvoie une liste vide. – singpolyma

+0

Belle prise ... J'ai complètement effleuré cette partie en essayant d'obtenir le code de la classe pour la poste. –