【发布时间】:2012-11-04 10:07:15
【问题描述】:
我正在运行 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 的其余部分时运行的。
作为我尝试过的变体:
- 使用新的 QNetworkAccessManager(mainWindow) - mainWindow 继承自 QMainWindow
- 使用新的 QNetworkAccessManager(application) - 应用程序继承自 QApplication
- 从 customEvent 调用 load()
- 从计时器回调中调用 load()
[编辑]
我现在在 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),parent的线程是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();
}
【问题讨论】:
-
manager->get(reply) 应该在 QNetworkAccessManager::finished(QNetworkReply*) 信号之后调用
-
我现在把 QNetworkAccessManager 的构造放在 MainWindow 构造函数中: 'MainWindow::MainWindow() : queryAnalyser(NULL) { manager = new QNetworkAccessManager(this);连接(经理,信号(完成(QNetworkReply*)),这个,SLOT(managerFinished(QNetworkReply*)));'
标签: qt