#c #qt #qnetworkaccessmanager
#c #qt #QNetworkAccessManager
Вопрос:
Я следую этому документу http://developer.nokia.com/community/wiki/Creating_an_HTTP_network_request_in_Qt пытаюсь реализовать http-соединение, и мой код компилируется без ошибок, но при запуске программы происходит сбой.
//coreeng.cpp
#include "coreeng.h"
#include <QNetworkAccessManager>
#include <QUrl>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QImageReader>
coreEng::coreEng(QObject *parent) :
QObject(parent)
{
}
void coreEng::connect(){
QObject::connect(nam, SIGNAL(finished(QNetworkReply*)),
this, SLOT(finishedSlot(QNetworkReply*)));
}
void coreEng::url(){
QUrl url("http://www.forum.nokia.wiki");
QNetworkReply* reply = nam->get(QNetworkRequest(url));
}
void coreEng::finishedSlot(QNetworkReply* reply){
QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
QVariant redirectionTargetUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
if (reply->error() == QNetworkReply::NoError)
{
QImageReader imageReader(reply);
QImage pic = imageReader.read();
QByteArray bytes = reply->readAll(); // bytes
QString string(bytes); // string
}
else
{
}
delete reply;
}
//coreeng.h
#ifndef COREENG_H
#define COREENG_H
#include <QObject>
#include <QNetworkAccessManager>
class coreEng : public QObject
{
Q_OBJECT
public:
explicit coreEng(QObject *parent = 0);
private slots:
public slots:
void connect();
void url();
void finishedSlot(QNetworkReply* reply);
private:
QNetworkAccessManager* nam;
};
#endif // COREENG_H
//main.cpp
#include <QCoreApplication>
#include "coreeng.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
coreEng mConnect;
mConnect.connect();
return a.exec();
}
Ответ №1:
Вам следует уделять больше внимания своему коду на c :
QNetworkAccessManager* nam;
nam
используется, но никогда не создается. Вы должны создать его в coreEng
конструкторе:
coreEng::coreEng(QObject *parent) :
QObject(parent), nam( new QNetworkAccessManager(this) )
{
}
Другая проблема заключается в:
delete reply;
Документы Qt говорят:
Не удаляйте объект ответа в слоте, подключенном к этому сигналу. Используйте deleteLater().
Комментарии:
1. Большое вам спасибо за ваш ответ. вы имеете в виду вот так? явное ядро (QObject parent = 0) { QNetworkAccessManager nam; }
2. Нет. Это создало бы локальную переменную в стеке с жизненным циклом, ограниченным временем жизни конструктора. Что-то вроде
nam = new QNetworkAccessManager();
должно это сделать. При всем моем уважении, основываясь на серии ваших вопросов, вы можете рассмотреть возможность прохождения курса C .3. Я получаю плохие ошибки, когда я заставляю свой конструктор выглядеть так i.imgur.com/Fl2VAYK.png
4. @брэд, пожалуйста, сравните ваш конструктор и мой конструктор. Найдите разницу.
5. копирование / вставка = огни рождественской елки. ошибка дополнительного квалификатора является первой