对Qt的事件循环系统感到困惑?

Confused by the Qt's event loop system?

本文关键字:循环系统 Qt 事件      更新时间:2023-10-16

文档说Qt的事件循环是FIFO。但是我对文档有点困惑,所以如果:我有两个按钮,第一个就可以了:

on_click_button_one(){
    list.append(new_element);
}

第二个将做:

on_click_button_two(){
  while(!list.empty()){
    list.remove_top();
  }
}

由于列表可能非常大,因此清除列表需要一些时间。但是如果我在清算过程中点击按钮,会发生什么?两个on_click_button函数位于同一线程中。

什么都没有,因为你的GUI不会与用户交互,因为你所有的主线程都会删除列表,如果它需要5秒,那么5秒你的GUI将被冻结。

如果你在每次迭代时都会调用processEvents(),让你的GUI解冻,那么你应该禁用你的第一个按钮或使用QProgressDialog来显示操作进度。

主线程中的 AFAIK 函数和另一个线程中的函数可以同时(并行)执行,但同一线程中的 2 个函数不能同时执行。如果您不使用类似 std::threadQtConcurrentQThread 的东西,那么我认为您可以确定这两个插槽存在于一个线程中,并且永远不会同时执行。