Qt信号槽连接 - QNetworkAccessManager

5

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

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

为什么我们要在完成请求后连接“完成”信号?…如果链接2中的网络连接比连接3更快,会发生什么情况?

我知道这个代码能够工作。但我想了解为什么。

1个回答

6

因为你还没有让事件循环执行,所以无法触发finished()信号。即使某种方式下get请求已经发送并返回,你的代码仍在执行,并将继续执行,直到你让事件循环执行。只有这样,回复对象才有机会实际执行任何操作,例如解析get响应并发出相应的信号。


另外,有些情况下请求可能会立即完成(比如访问 fileqrc URL 方案时;这时没有涉及到网络)。无论如何,在返回事件循环之前,QNR 都不会触发 finished()。在 Qt 中实现这一点的标准方式——作为一般模式,对您的类有用——是调用 QMetaObject::invokeMethod(this, "signalName", Qt::QueuedConnection) - peppe
1
我个人遇到了一个情况,即执行原始帖子中第二行和第三行代码的线程不是主线程(主线程是处理事件的线程)。因为它们是单独的线程,这是否可能使得在调用connect()之前处理事件?QNetworkAccessManager在主线程中创建,但get()发生在单独的线程中。 - Patrick Avery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接