gpt4 book ai didi

c++ - 当在错误槽中启动事件循环时发生 ContentNotFoundError 时,QNetworkReply 会发出两次错误信号

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:22 25 4
gpt4 key购买 nike

我正在使用 QtSDK 4.7.3

我在 (void test()) 中这样做:

mgr = new QNetworkAccessManager();
reply = mgr->get(QNetworkRequest(QUrl("http://developer.qt.nokia.com/fileNotExisting.txt")));

connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
SLOT(onError(QNetworkReply::NetworkError)), Qt::ConnectionType::UniqueConnection);

当然,插槽 onError 被调用:

if (networkError == QNetworkReply::NetworkError::ContentNotFoundError)
{
// Messagebox starts an event loop which
// causes this slot to be called again
QMessageBox m;
m.exec();
}

如果我在 onError 插槽中没有消息框/事件循环,则不会发生崩溃,一切正常。但是当它存在时,调用 m.exec() 时会再次调用 onError 插槽。当两个消息框都关闭并且我将函数保留为 onError 时,应用程序崩溃。发生这种情况时,应用程序会尝试删除/释放内存。错误“访问冲突读取位置”没有任何帮助,调用堆栈深入到 Qt dll。

我检查过的:
信号二次未连接。
尝试在 QApplication 调用它的 exec 函数之前和之后调用 test()。 (没关系)。
另外一个类似HostNotFound的错误不会调用onError槽两次。
我所有的代码都在主线程中执行。
尝试断开 onError 插槽,因此它只被调用一次,但它仍然崩溃。
尝试在 onError() 中对请求调用 abort。
在 Qt 论坛 ( post ) 上发布了同样的问题。

谁能帮我弄清楚这里发生了什么?

这是我用来测试的代码: main.cpp

#include "contentnotfound.h"
#include <QtGui/QApplication>
#include <QTimer>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

ContentNotFound cnf;

// false: start test after application's event loop have started
if (true) { cnf.test(); }
else { QTimer::singleShot(2000, &cnf, SLOT(test())); }

return a.exec();
}

contentnotfound.h

#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QMessageBox>

class ContentNotFound : public QObject
{
Q_OBJECT

public slots:
void test()
{
mgr = new QNetworkAccessManager();
reply = mgr->get(QNetworkRequest(QUrl("http://developer.qt.nokia.com/fileNotExisting.txt")));

connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
SLOT(onError(QNetworkReply::NetworkError)), Qt::ConnectionType::UniqueConnection);
}

private slots:
void onError(QNetworkReply::NetworkError networkError)
{
//reply->disconnect(); // Disconnect all signals

if (networkError == QNetworkReply::NetworkError::ContentNotFoundError)
{
// Messagebox starts an event loop which
// causes this slot to be called again
QMessageBox m;
m.exec();
}
}

private:
QNetworkAccessManager* mgr;
QNetworkReply* reply;

};

最佳答案

Qt < 4.8.0 中存在错误:https://bugreports.qt.io/browse/QTBUG-16333

修改与排队连接的连接解决了问题:

contentnotfound.h:

#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QMessageBox>

class ContentNotFound : public QObject
{
Q_OBJECT

public slots:
void test()
{
qRegisterMetaType<QNetworkReply::NetworkError>("QNetworkReply::NetworkError");
mgr = new QNetworkAccessManager(this);
reply = mgr->get(QNetworkRequest(QUrl("http://developer.qt.nokia.com/fileNotExisting.txt")));

connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
SLOT(onError(QNetworkReply::NetworkError)), Qt::QueuedConnection);
}

private slots:
void onError(QNetworkReply::NetworkError networkError)
{
//reply->disconnect(); // Disconnect all signals

if (networkError == QNetworkReply::ContentNotFoundError)
{
// Messagebox starts an event loop which
// causes this slot to be called again
QMessageBox m;
m.exec();
}
}

private:
QNetworkAccessManager* mgr;
QNetworkReply* reply;

};

关于c++ - 当在错误槽中启动事件循环时发生 ContentNotFoundError 时,QNetworkReply 会发出两次错误信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7650978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com