Qt信号槽连接——QNetworkAccessManager

Posted

技术标签:

【中文标题】Qt信号槽连接——QNetworkAccessManager【英文标题】:Qt signal slot connection - QNetworkAccessManager 【发布时间】:2013-05-18 18:26:24 【问题描述】:

我是 Qt 新手,我正在尝试理解以下信号槽连接:

m_networkManager = new QNetworkAccessManager(this);
QNetworkReply *reply = m_networkManager->get(request);
connect(reply, SIGNAL(finished()),this, SLOT(onRequestCompleted()));

为什么我们在 get-request 之后连接“finished”信号?...如果第 2 行的网络连接在插槽连接(第 3 行)建立之前执行得更快,会发生什么?

我知道,这段代码会起作用。但我想了解这怎么可能:)

【问题讨论】:

【参考方案1】:

finished() 信号不可能发出,因为您还没有屈服于事件循环。即使 get 请求以某种方式被发送然后返回,您的代码仍在执行并将继续执行,直到您屈服于事件循环。只有这样,回复对象才有机会实际执行任何操作,例如解析 get 响应并发出相应的信号。

【讨论】:

补充一点,在某些情况下请求实际上可以立即完成(想想 f.i. 在访问 fileqrc URL 方案时;不涉及网络)。在任何情况下,QNR 在返回事件循环之前都不会触发 finished()。在 Qt 中实现它的标准方法——作为一种通用模式,对你的类很有用——调用QMetaObject::invokeMethod(this, "signalName", Qt::QueuedConnection) 我个人有一个案例,原帖中执行第二行和第三行代码的线程不是主线程(主线程是处理事件的线程)。因为它们是单独的线程,这是否可以在调用 connect() 之前处理事件? QNetworkAccessManager 是在主线程中创建的,但 get() 发生在单独的线程中。

以上是关于Qt信号槽连接——QNetworkAccessManager的主要内容,如果未能解决你的问题,请参考以下文章

Qt源码阅读 信号槽的连接与调用

Qt信号槽连接——QNetworkAccessManager

Qt::浅谈信号槽连接,参数在多线程中的使用

QT入门-信号槽拓展

如何进行 Qt QLed 信号槽连接? [关闭]

qt多线程信号槽传输方式