2014-10-03 3 views
4

Я заметил, что класс QHttp больше не доступен в Qt5, и я продолжаю получать сообщение об ошибке, в котором говорится, что мне нужно использовать QNetworkAccessManager для этого.QHttp в недоступности в Qt5

Есть ли способ получить доступ к этому классу в Qt5?

+3

Да, вы должны использовать либо QNetworkAccessManager (предпочтительно) или использовать совместимость надстройку QtHttp, который обеспечивает класс QHttp, как это было в Qt4. – user2672165

+0

Спасибо, но я не понимаю, «как это сделать». Я просто ученик. – Neokon

+1

Это зависит от того, что вы хотите сделать. Вам нужно попытаться что-то закодировать, а затем отправить код, чтобы получить помощь здесь. – user2672165

ответ

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; 
} 
1

Предполагая, что вам не нужно поддерживать огромную базу кода, правильным способом является использование нового класса QNetworkAccessManager.

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; 

} 

Вы также можете сделать это в асинхронном режиме, подключив finished сигнал QNetworkAccessManager к слоту:

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

и читать данные есть:

void onFinished(QNetworkReply* reply) 
{ 

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

     ... 
    } 
} 
Смежные вопросы