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. 在访问file
或 qrc
URL 方案时;不涉及网络)。在任何情况下,QNR 在返回事件循环之前都不会触发 finished()
。在 Qt 中实现它的标准方法——作为一种通用模式,对你的类很有用——调用QMetaObject::invokeMethod(this, "signalName", Qt::QueuedConnection)
。
我个人有一个案例,原帖中执行第二行和第三行代码的线程不是主线程(主线程是处理事件的线程)。因为它们是单独的线程,这是否可以在调用 connect() 之前处理事件? QNetworkAccessManager 是在主线程中创建的,但 get() 发生在单独的线程中。以上是关于Qt信号槽连接——QNetworkAccessManager的主要内容,如果未能解决你的问题,请参考以下文章