在等待QTcpSocket数据时阻塞GUI

Block GUI when waiting for QTcpSocket data

本文关键字:GUI QTcpSocket 数据 在等待      更新时间:2023-10-16

我正在编写一个程序,使用Qt与基于网络的API进行交互。与API的交互使用XML消息(查询和结果)

我在一个共享库项目中的一个类中实现了通信和数据处理,我有一个QMainWindow,用户可以在其中输入连接细节。当点击连接按钮时,会发生以下情况:1. 将创建连接类的一个实例。2. 将连接消息发送到API以获取会话ID。解析答案,并将会话ID存储在类实例中。3.消息被发送到API以获取一些字段信息。然后解析XML以提取所需的字段信息,从而从API获取数据。4. 发送另一条消息以获取与字段匹配的数据。然后解析XML答案并将其存储在一个数据结构中以供处理。5. 然后对数据进行处理并最终显示给用户。

我做了一个简单的控制台程序来测试库,它工作得很好-在处理前一个消息的所有数据之前没有发送消息。然而,当我在QMainWindow实例中实现相同的过程时,没有等待发生,消息一个接一个地发送,而不需要等待。

我如何阻止GUI线程在发送下一条消息之前等待完全处理?

谢谢

阻塞UI不是通过阻塞事件循环来实现的。这是通过禁用那些你不想与之交互的小部件来实现的——要么直接调用它们的disable()方法,要么基于一些状态变量来保护交互,例如:

connect(button, &QPushButton::clicked, button, [this]{
  if (! hasAllData) return;
  // react to a button press
});

您所需要的只是定义一组应用程序可以处于的状态,并在适当的状态下禁用相关的小部件。我认为,一旦建立了会话,无论如何并行地发出所有查询是最快的,并且在回复实时返回时异步更新UI。