Qt信号插槽连接-QNetworkAccessManager

Qt信号插槽连接-QNetworkAccessManager,qt,signals,qnetworkaccessmanager,slot,Qt,Signals,Qnetworkaccessmanager,Slot,我是Qt中的新手,我试图理解以下信号插槽连接: m_networkManager = new QNetworkAccessManager(this); QNetworkReply *reply = m_networkManager->get(request); connect(reply, SIGNAL(finished()),this, SLOT(onRequestCompleted())); 为什么在get请求之后连接“finished”信号?…如果第2行中的网络连接在插槽连接(第3

我是Qt中的新手,我试图理解以下信号插槽连接:

m_networkManager = new QNetworkAccessManager(this);
QNetworkReply *reply = m_networkManager->get(request);
connect(reply, SIGNAL(finished()),this, SLOT(onRequestCompleted()));
为什么在get请求之后连接“finished”信号?…如果第2行中的网络连接在插槽连接(第3行)之前执行得更快,会发生什么


我知道,这个代码会起作用。但我想了解这是如何实现的:)

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

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