我正在运行Qt 4.8.1
我正在尝试使用QNetworkRequest发送请求,而我正在获得'QEventLoop:不能在没有QApplication的情况下使用'错误。我相信我在一个事件循环中运行。
void WebLoader::load()
{
QNetworkRequest request;
request.setUrl(QUrl("http://www.bbc.co.uk/"));
QNetworkAccessManager *manager = new QNetworkAccessManager();
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(checkForUpdateFinished(QNetworkReply*)));
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(readyRead()), this, SLOT(checkForUpdateSlot()));
}
manager-> get(reply)调用永远不会返回。
单击菜单项时将调用此函数。堆栈跟踪中有QWidget :: event(QEvent)。该应用程序肯定会与其他复杂的UI一起运行。
作为我尝试过的变种:
[编辑]
我现在正在MainWindow构造函数中构建QNetworkAccessManager:
MainWindow::MainWindow() : queryAnalyser(NULL)
{
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(managerFinished(QNetworkReply*)));
managerFinished没有被调用。
我正在调试IO: 'QObject:无法为不同线程中的父级创建子级。 (Parent是MainWindow(0x28fcd0),父线程是QThread(0x4862828),当前线程是QThread(0x7d90b70)'
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
WXApplication *a = WXApplication::getApp();
MainWindow mainWin;
mainWin.show();
mainWin.checkArgs();
return app.exec();
}
答案 0 :(得分:0)
确保在感知请求的方法结束时不会销毁QNetworkAccessManager
。如果它被销毁,您的请求将丢失,因为被破坏的QNetworkAccessManager
将无法将finished()
信号发送到连接的插槽。
这正是WebLoader::load();
方法中发生的情况。 manager
变量仅在方法执行期间存在,并且方法将在您收到回复之前结束。
您可以做的是将QNetworkAccessManager
放在全局变量中,并在每次需要时使用此全局变量:
Afile.hpp:
//...
#include <QNetworkAccessManager>
extern QNetworkAccessManager QNAM;
//...
Afile.cpp:
//...
#include "afile.hpp"
QNetworkAccessManager QNAM = QNetworkAccessManager();
//...
在您的代码中(例如WebLoader::load();
):
//...
#include "afile.hpp"
//...
QNetworkAccessManager * manager = &QNAM;
//...
在请求中,将原始对象设置为“标记”请求,并确保正确的方法将处理正确的回复:
void WebLoader::load()
{
QNetworkRequest request;
request.setUrl(QUrl("http://www.bbc.co.uk/"));
request.setOriginatingObject(this);
QNetworkAccessManager * manager = &QNAM;
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkForUpdateFinished(QNetworkReply*)));
manager->get(request);
}
void WebLoader::checkForUpdateFinished(QNetworkReply* reply)
{
if (reply == 0 || reply->request().originatingObject() != this)
{
return;
}
disconnect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(checkForUpdateFinished(QNetworkReply*)));
// Reply treatment
reply->deleteLater();
// ...
}
在MainWindow
构造函数中,如果没有必要,请忘记this
或使用QNAM
全局变量。