QNetworkAccessManager 失败
Posted
技术标签:
【中文标题】QNetworkAccessManager 失败【英文标题】:QNetworkAccessManager fails 【发布时间】:2014-06-13 19:08:04 【问题描述】:我正在关注此文档 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 docs 说:
不要删除连接到这个信号的槽中的回复对象。使用 deleteLater()。
【讨论】:
非常感谢您的回复。你的意思是这样吗?显式 coreEng(QObject parent = 0) QNetworkAccessManager nam; 没有。这将在堆栈上创建一个局部变量,其生命周期仅限于构造函数的生命周期。nam = new QNetworkAccessManager();
之类的东西应该这样做。恕我直言,根据您的一系列问题,您可能需要考虑一门 C++ 课程。
当我让我的构造函数看起来像 i.imgur.com/Fl2VAYK.png 时出现严重错误
@brad,请比较你的构造函数和我的构造函数。找出差异。
复制/粘贴 = 圣诞树灯。额外的限定符错误是第一个以上是关于QNetworkAccessManager 失败的主要内容,如果未能解决你的问题,请参考以下文章
使用 QNetworkAccessManager 时启动 QThread 失败
使用 QWebKit 的永久 cookie——从哪里获得 QNetworkAccessManager?
使用 QNetworkAccessManager 通过 HTTPS 下载文件:如何进行身份验证?
错误:没有用于调用“QNetworkAccessManager::QNetworkAccessManager(Networking* const)”的匹配函数