在PyQt中,我需要处理itemClicked和itemSelectionChanged,但不能同时处理它们

时间:2015-09-16 00:20:03

标签: pyqt pyside

我创建了QTreeWidget,显示了从第三方API调用中提取的数据。

当用户点击或使用箭头键导航到任何QTreeWidgetItem时,我希望数据是新鲜的。这意味着每次用户单击或使用箭头键时都会进行API调用。重要的是:如果用户第二次点击同一项目,我希望该项目显示新数据(换句话说,进行另一个API调用并填充新数据,即刷新)

到目前为止,我已经尝试过了:

  • itemSelectionChangeditemClicked连接到同一更新功能。这有效,但这意味着对于新QTreeWidgetItem的每次点击,我都会有两次调用更新函数(一个来自itemClicked,另一个来自itemSelectionChanged),因此有两个API调用完全相同的事情。不理想。
  • 仅处理itemClicked,然后使用事件过滤器查找Key_UpKey_Down,然后手动发出itemClicked。这个问题是在更改选择之前处理了键事件,因此在使用箭头键时,我总是获取所选 last QTreeWidgetItem的数据,而不是当前QTreeWidgetItem

我考虑过创建一个非常短的计时器或一个标志,并在更新功能的开始时启动/设置。如果计时器正在运行或设置了标志,则不要运行该功能(这个想法是第一个插槽将运行,但第二个插槽不会因为标志设置/计时器正在运行),但这似乎都是草率,容易出现竞争条件。

不幸的是,使用带有QTreeView的{​​{1}}不是一种选择。

有了这个,有没有办法处理同一项目的重复点击和箭头键选择新项目而不需要双重调用相同的更新功能?

1 个答案:

答案 0 :(得分:0)

正如@ekhumoro指出的那样,这可以通过处理itemClickeditemSelectionChanged来完成,但是引入一些逻辑,以便两个函数不会同时运行。

当用户点击窗口小部件时,会触发itemClicked信号。当用户更改选择时,将触发itemSelectionChanged信号。在我的情况下,我创建了两个插槽(功能):updateitemSelectionChanged的插槽)和updateFromClickitemClicked的插槽)。 updateFromClick检查选择是否已更改(这意味着您始终必须存储并跟踪当前选择)。如果在updateFromClick中,我看到选择已更改,那么我什么都不做,因为update将从itemSelectionChanged调用。如果在updateFromClick中,我发现选项没有更改,我知道itemSelectionChanged未被触发,因此我从update明确调用updateFromClick函数。< / p>

同样,这只是@ ekhumoro评论中的一个冗长版本,我正在这里放置,所以这个问题没有得到解答。