- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一个类似的question但我没有发现它对我的问题有用。
在 Qt 中 documentation ,他们说:
One QNetworkAccessManager instance should be enough for the whole Qt application.
在我的应用程序中,我在多个地方使用了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;
}
}
我很乐意使用 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
。因此,我更新了我的问题。
最佳答案
您可以随意使用整个 Qt。不要为此使用静态变量 - 你无法控制它们的生命周期,而且生命周期几乎总是错误的。当 QCoreApplication
不存在时,QNetworkManager
不应存在。该警告根本不是良性的——它表示一个基本的设计问题。 您需要控制管理器的生命周期,并确保它不会超过QApplication
。管理此类全局应用程序绑定(bind)对象的规范方法是将它们作为自动变量保存在 main
中,并使用辅助函数来访问它们。 QPointer
自动跟踪对象的生命周期,因此永远不会悬空。因此:
QNetworkAccessManager *nMgr();
// This pointer is local to the translation unit, and is an
// implementation detail. It's not used anywhere else.
static QPointer<QNetworkAccessManager> globalManager;
// The global accessor method
QNetworkAccessManager *nMgr() {
Q_ASSERT(!qApp || QThread::currentThread() == qApp->thread());
return globalManager;
}
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QNetworkAccessManager mgr;
globalManager = &mgr;
...
}
关于c++ - 如何拥有一个 QNetworkAccessManager 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50691136/
这是我的文件。我对此有一些疑问。 // networking.h #ifndef NETWORKING_H #define NETWORKING_H #include class Networ
我是 Qt 新手,我试图了解以下信号槽连接: m_networkManager = new QNetworkAccessManager(this); QNetworkReply *reply = m_
我尝试对 REST 服务执行简单的 GET 操作,并想知道如何识别/关联请求与我在 SLOT 函数中获得的响应。例如,我可能会向同一经理发送多个请求,并希望传递一个 messageID,以便在我的 S
我有一个非常困惑的问题。 我有一个简单的项目,它从一些 ftp 服务器下载文件。效果非常好。 然后,我尝试将相同的代码实现到一个更大的项目中(第一个是控制台应用程序,第二个是 GUI,但我认为这不会改
我正在尝试在 CentOS 6.4 上的 Qt 5.0 中使用 QNetworkAccessManager 将文件上传到服务器。 我曾尝试在网上遵循一些示例,但它们都不起作用。 QFTP 工作得很好,
目前我正在开发一个从远程服务器发送和接收文件的应用程序。为了进行网络操作,我正在使用 QNetworkAccessManager。 要上传文件,我使用 QNetworkAccessManager::p
函数 CheckSite() 使用类似 http://example.com 的 URL 调用,它初始化一个 QNetworkAccessManager 对象和 connect() 插槽和信号。 ma
在 qt4.8 中,仍然有 qhttp 类,我可以使用 http->hasPendingRequests()检查是否还有待处理的请求。 但是在qt5中,我们被迫使用QNetworkAccessMana
QNetworkAccessManager 工作得很好,然后每次在 get() 方法上都开始崩溃,这非常简单: QNetworkReply *reply = myManager->get(QNetwo
我有一个从 QObject 派生的类“下载器”,它在工作线程中运行。当线程启动时,下载器在堆上创建一个 QNetworkAccessManager 对象,并开始请求文件。我会跟踪请求和接收了多少文件。
所以我有这段代码: QUrl url("http://..."); QNetworkRequest request(url); QNetworkReply *reply = m_networkMana
我的第一个 Qt 应用程序正在开发中。它是用于站点消息传递的桌面客户端。 Qt 文档说我只需要一个 QNetworkAccessManager 跨应用程序实例。但我也读到在 Qt 中使用单例不是一个好
我想直接请求和响应,而不是使用 connect(..,SLOT(finished()),..,SLOT()) 最佳答案 您可以使用QEventLoop,以便应用程序等待并可以同时处理其他事件。 #in
我在另一个线程中创建了一个 QNetworkAccessManager。该网络只能在 MyMegaThread 中使用。 QNetworkAccessManager 是从线程的 run 方法创建的:
我正在尝试使用以下代码下载网页的源代码头文件: #include #include #include #include #include class CDownloader : public
我有以下代码: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我正在使用 Qt 4.7.4 中的 QtNetwork 为 VLC 2.0 编写一个 HTTP 访问模块。我的代码片段如下: static int Open(vlc_object_t *p_this)
在我的应用程序中,我有一个将文件上传到服务器的方法,这个方法工作正常。 但是,当我一次多次调用此方法时(例如遍历 chooseFilesDialog 的结果),前 7 个(或多或少)文件已正确上传,其
QString My_class::My_Method() { QNetworkAccessManager *manager= new QNetworkAccessManager(this);
我是一名优秀的程序员,十分优秀!