2014-10-03 35 views
4

我注意到Qt5中不再提供QHttp類,並且我不斷收到一條錯誤消息,說我需要使用QNetworkAccessManager來執行此操作。QHttp在Qt5中不可用

有沒有辦法在Qt5中訪問這個類?

+3

是的,你需要要麼使用QNetworkAccessManager(首選)或使用兼容性附加QtHttp它提供了QHTTP類,因爲它是在Qt4的。 – user2672165 2014-10-03 14:00:48

+0

謝謝,但我不明白的是「怎麼做」。我只是一個學習者。 – Neokon 2014-10-03 14:02:43

+1

這取決於你想要做什麼。您需要嘗試編碼,然後提交代碼以獲得幫助。 – user2672165 2014-10-03 14:14:57

回答

4

這是一個簡單的HTTP後(我使用Qt 5.3.2)

int Connection::postRequest(QString requestType, QUrl params){ 
    QString params_array = params.query(); 

    QNetworkRequest request(user->url); 
    request.setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(params_array.size())); 
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); 

    QEventLoop waitLoop; 
    QNetworkAccessManager* connection = new QNetworkAccessManager(/*`this` can also be passed*/); 
    QNetworkReply* reply = connection->post(request, params_array.toUtf8()); 
    QObject::connect(reply, SIGNAL(finished()), &waitLoop, SLOT(quit())); 
    waitLoop.exec(); 

    int errorCode = reply->error(); 
    if (errorCode != 0){ 
     // Show Error Message 
    } 
    else{ 
     // Parse "reply" 
    } 

    delete reply; 
    delete connection; 
    return errorCode; 
} 
4

使用QNetworkAccessManager Qt中5.你可以使用一個事件循環要等到答覆完畢,然後閱讀可用字節:

QString My_class::My_Method() 
{ 

    QNetworkAccessManager manager; 

    QNetworkReply *reply = manager.get(QNetworkRequest(QUrl(myURL))); 

    QEventLoop loop; 
    connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); 
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), &loop, SLOT(quit())); 
    loop.exec(); 

    QByteArray bts = reply->readAll(); 
    QString str(bts); 

    delete reply; 

    return str; 

} 

也可以通過QNetworkAccessManagerfinished信號連接到一個槽做在異步方式:

connect(&manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(onFinished(QNetworkReply*))); 

還有讀取數據:

void onFinished(QNetworkReply* reply) 
{ 

    if (reply->error() == QNetworkReply::NoError) 
    { 
     QByteArray bts = reply->readAll(); 

     ... 
    } 
}