在 PyQt 中,我需要同时处理 itemClicked 和 itemSelectionChanged,但不能同时处理这两者

In PyQt, I need to handle both itemClicked and itemSelectionChanged, but not both at the same time

我创建了一个 QTreeWidget 来显示从第 3 方 API 调用中提取的数据。

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

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

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

不幸的是,使用 QTreeViewQAbstractItemModel 不是一个选项。

这样一来,有什么方法可以同时处理重复单击同一项目和使用箭头键指向 select 新项目而无需两次调用相同的更新函数?

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

当用户单击小部件时,会触发 itemClicked 信号。当用户更改选择时,将触发 itemSelectionChanged 信号。那么,在我的例子中,我创建了两个槽(函数):update(一个用于 itemSelectionChanged 的槽)和 updateFromClick(一个用于 itemClicked 的槽)。 updateFromClick 检查选择是否已更改(这意味着您始终必须存储并跟踪当前选择)。如果在 updateFromClick 中,我发现选择已更改,那么我什么都不做,因为 update 将从 itemSelectionChanged 调用。如果在 updateFromClick 中,我看到选择没有改变,我知道 itemSelectionChanged 没有被触发,所以我从 updateFromClick 中显式调用 update 函数。

同样,这只是我在这里发表的 @ekhumoro 评论的冗长版本,所以问题不会得不到解答。