Note that there are some explanatory texts on larger screens.

plurals
  1. PORequest with QNetworkAccessManager
    text
    copied!<p>I have a strange problem with getting reply from get request with QNetworkAccessManager.</p> <p>This is code of class: </p> <p>requester.h</p> <pre><code>#ifndef REQUESTER_H #define REQUESTER_H #include &lt;QtNetwork/QNetworkAccessManager&gt; #include &lt;QtNetwork/QNetworkReply&gt; #include &lt;QtCore/QtCore&gt; #include &lt;QVector&gt; #include &lt;QObject&gt; #include &lt;QMessageBox&gt; class Requester : public QObject { Q_OBJECT public: explicit Requester(QObject *parent = 0); ~Requester(); QString get_last_reply(); void send_request(); private: QNetworkAccessManager *manager; QVector&lt;QString&gt; replies; private slots: void get_reply(QNetworkReply *reply); void get_reply_error(QNetworkReply::NetworkError err); }; #endif // REQUESTER_H </code></pre> <p>requester.cpp</p> <pre><code>#include "requester.h" Requester::Requester(QObject *p) : QObject(p) , manager(new QNetworkAccessManager) { QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(get_reply(QNetworkReply*))); } Requester::~Requester() { delete manager; } void Requester::get_reply(QNetworkReply *reply) { QObject::connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(get_reply_error(QNetworkReply::NetworkError))); QByteArray res = reply-&gt;readAll(); QString data = res.data(); replies.push_back(data); QObject::disconnect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(get_reply_error(QNetworkReply::NetworkError))); reply-&gt;deleteLater(); } void Requester::get_reply_error(QNetworkReply::NetworkError err) { QMessageBox msg; msg.setText(QString::number(err)); msg.setStandardButtons(QMessageBox::Discard); msg.exec(); } QString Requester::get_last_reply() { if(!(replies.isEmpty())) { QString res = replies.back(); replies.pop_back(); return res; } return ""; } void Requester::send_request() { QNetworkRequest request; request.setUrl(QUrl("http://127.0.0.1")); request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17"); manager-&gt;get(request); //QMessageBox *msg = new QMessageBox; //msg-&gt;exec(); } </code></pre> <p>Reply is written in textEdit by this function</p> <pre><code>void MainWindow::ret_out(QString str) { ui-&gt;out-&gt;setText(str); } </code></pre> <p>Now main.cpp </p> <pre><code>int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; Requester req; req.send_request(); //QMessageBox *msg = new QMessageBox; //msg-&gt;exec(); QString buf = req.get_last_reply(); w.show(); w.ret_out(buf); return a.exec(); } </code></pre> <p>Using this code I have empty textEdit. But if uncomment </p> <pre><code>QMessageBox *msg = new QMessageBox; msg-&gt;exec(); </code></pre> <p>in Requester::send_request or in main.cpp then textEdit contains server answer.</p> <p><strong>New Update</strong></p> <p>Now I have this code and it works. Maybe it's not the best variation, but I'll listen to your advices with greate pleasure :)</p> <pre><code>void Requester::send_request(QUrl url) { QEventLoop loop; loop.connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(get_reply(QNetworkReply*))); loop.connect(this, SIGNAL(done()), &amp;loop, SLOT(quit())); QNetworkRequest request; request.setUrl(url); request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17"); manager-&gt;get(request); loop.exec(QEventLoop::AllEvents); loop.disconnect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(get_reply(QNetworkReply*))); loop.disconnect(this, SIGNAL(done()), &amp;loop, SLOT(quit())); } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload