我正在编写一个程序,使用Qt与基于网络的API进行交互。 与API的交互是使用XML消息(查询和结果)进行的。
我在共享库项目的类中实现了通信和数据处理,我有一个QMainWindow,用户可以在其中输入连接详细信息。单击连接按钮时,应发生以下情况: 1.创建连接类的实例。 2.将连接消息发送到API以获取会话ID。解析答案并将会话ID存储在类实例中。 3.向API发送消息以获取一些字段信息。然后解析XML以提取所需的字段信息以从API获取数据。 4.发送另一条消息以获取与字段匹配的数据。然后解析XML答案并将其存储在数据结构中以进行处理。 5.然后处理数据并最终显示给用户。
我制作了一个简单的控制台程序来测试库,它运行正常 - 在处理完上一条消息的所有数据之前没有发送消息。但是,当我在QMainWindow实例中实现相同的进程时,不会发生等待,并且无需等待即可一个接一个地发送消息。
如何在发送下一条消息之前阻止GUI线程等待完整处理?
由于
答案 0 :(得分:2)
阻止事件循环无法阻止UI。它是通过禁用您不想允许与之交互的小部件来完成的 - 通过字面上调用它们的disable()
方法,或者通过基于某个状态变量来保护交互,例如:< / p>
connect(button, &QPushButton::clicked, button, [this]{
if (! hasAllData) return;
// react to a button press
});
您只需要定义应用程序可以处于的一组状态,并在适当的状态下禁用相关的小部件。我认为一旦会话建立起来,无论如何都能最快地并行发出所有查询,并且当回复实时返回时异步更新UI。