【发布时间】:2018-11-14 09:53:21
【问题描述】:
有一个类似的question,但我没有发现它对我的问题有用。
在 Qt documentation 中,他们说:
一个 QNetworkAccessManager 实例应该足以满足整个 Qt 应用程序的需求。
在我的应用程序中,我在多个地方使用了QNetworkAccessManager(它们可能同时被调用),并且每次我在堆栈上创建新实例时。在阅读了那句话之后,我将我的代码更改为一个静态的QNetworkAccessManager 并在任何地方使用它。将其更改为静态成员后,我总是收到警告:
QObject::connect: Cannot connect (null)::aboutToQuit() to QNativeWifiEngine::closeHandle()
在这两种情况下,代码都可以正常工作,但是,该文档让我有点困惑。由于该产品将要商业化,我正在认真对待这个问题。我应该遵循文档还是避免警告?或者你有什么其他的建议吗?
如果不同线程上的对象需要使用QNetworkAccessManager 怎么办?
编辑:添加代码
单例设置类:
class ConnectionSettingsSingleton
{
...
// constructors = default
// copy constructor = delete
public:
static QNetworkAccessManager networkAccessManager;
}
我在不同的地方使用networkAccessManager,但方式相同:
QNetworkReply* HttpClient::makeRequest()
{
switch (this->method) {
case RequestMethod::GET:
return ConnectionSettingsSingleton::networkAccessManager.get(this->serverRequest);
case RequestMethod::POST:
return ConnectionSettingsSingleton::networkAccessManager.post(this->serverRequest, QJsonDocument(this->data).toJson());
case RequestMethod::DELETE:
return ConnectionSettingsSingleton::networkAccessManager.deleteResource(this->serverRequest);
default:
return nullptr;
}
}
编辑-2
我很友好地使用Kuba Ober's answer,有一次我收到了这个警告:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNetworkAccessManager(0x26f6d0), parent's thread is QThread(0x2b73b8), current thread is QThread(0xa4f20a8)
原因:我试图从不同的线程访问QNAM。因此,我更新了我的问题。
【问题讨论】:
标签: c++ qt oop c++11 design-patterns