在 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 调用并填充新数据,也就是刷新)
到目前为止,我已经尝试过:
- 将
itemSelectionChanged
和 itemClicked
连接到同一个更新函数。这行得通,但这意味着每次点击新的 QTreeWidgetItem
,我都会调用更新函数两次(一次来自 itemClicked
,另一次来自 itemSelectionChanged
),因此有两个 API 调用做完全相同的事情。不理想。
- 仅处理
itemClicked
,然后使用事件过滤器查找 Key_Up
或 Key_Down
,然后手动发出 itemClicked
。问题是关键事件是在 selection 改变之前处理的,所以当使用箭头键时,我总是获取 last QTreeWidgetItem
selected,不是当前的 QTreeWidgetItem
.
我考虑过创建一个非常短的计时器或一个标志,并 starting/setting 在更新功能的开始。如果计时器是 运行ning 或设置了标志,则不要 运行 函数(想法是第一个插槽会 运行,但第二个不会,因为标志是set/timer 是 运行ning),但这似乎既草率又容易出现竞争条件。
不幸的是,使用 QTreeView
和 QAbstractItemModel
不是一个选项。
这样一来,有什么方法可以同时处理重复单击同一项目和使用箭头键指向 select 新项目而无需两次调用相同的更新函数?
正如@ekhumoro 指出的那样,这可以通过同时处理 itemClicked
和 itemSelectionChanged
来完成,但引入一些逻辑以使两个函数不会同时 运行 .
当用户单击小部件时,会触发 itemClicked
信号。当用户更改选择时,将触发 itemSelectionChanged
信号。那么,在我的例子中,我创建了两个槽(函数):update
(一个用于 itemSelectionChanged
的槽)和 updateFromClick
(一个用于 itemClicked
的槽)。 updateFromClick
检查选择是否已更改(这意味着您始终必须存储并跟踪当前选择)。如果在 updateFromClick
中,我发现选择已更改,那么我什么都不做,因为 update
将从 itemSelectionChanged
调用。如果在 updateFromClick
中,我看到选择没有改变,我知道 itemSelectionChanged
没有被触发,所以我从 updateFromClick
中显式调用 update
函数。
同样,这只是我在这里发表的 @ekhumoro 评论的冗长版本,所以问题不会得不到解答。
我创建了一个 QTreeWidget
来显示从第 3 方 API 调用中提取的数据。
我希望当用户单击或使用箭头键导航到任何 QTreeWidgetItem
时数据是最新的。这意味着每次用户单击或使用箭头键时都会进行 API 调用。重要的是:如果用户第二次点击同一个项目,我希望该项目显示新数据(换句话说,进行另一个 API 调用并填充新数据,也就是刷新)
到目前为止,我已经尝试过:
- 将
itemSelectionChanged
和itemClicked
连接到同一个更新函数。这行得通,但这意味着每次点击新的QTreeWidgetItem
,我都会调用更新函数两次(一次来自itemClicked
,另一次来自itemSelectionChanged
),因此有两个 API 调用做完全相同的事情。不理想。 - 仅处理
itemClicked
,然后使用事件过滤器查找Key_Up
或Key_Down
,然后手动发出itemClicked
。问题是关键事件是在 selection 改变之前处理的,所以当使用箭头键时,我总是获取 lastQTreeWidgetItem
selected,不是当前的QTreeWidgetItem
.
我考虑过创建一个非常短的计时器或一个标志,并 starting/setting 在更新功能的开始。如果计时器是 运行ning 或设置了标志,则不要 运行 函数(想法是第一个插槽会 运行,但第二个不会,因为标志是set/timer 是 运行ning),但这似乎既草率又容易出现竞争条件。
不幸的是,使用 QTreeView
和 QAbstractItemModel
不是一个选项。
这样一来,有什么方法可以同时处理重复单击同一项目和使用箭头键指向 select 新项目而无需两次调用相同的更新函数?
正如@ekhumoro 指出的那样,这可以通过同时处理 itemClicked
和 itemSelectionChanged
来完成,但引入一些逻辑以使两个函数不会同时 运行 .
当用户单击小部件时,会触发 itemClicked
信号。当用户更改选择时,将触发 itemSelectionChanged
信号。那么,在我的例子中,我创建了两个槽(函数):update
(一个用于 itemSelectionChanged
的槽)和 updateFromClick
(一个用于 itemClicked
的槽)。 updateFromClick
检查选择是否已更改(这意味着您始终必须存储并跟踪当前选择)。如果在 updateFromClick
中,我发现选择已更改,那么我什么都不做,因为 update
将从 itemSelectionChanged
调用。如果在 updateFromClick
中,我看到选择没有改变,我知道 itemSelectionChanged
没有被触发,所以我从 updateFromClick
中显式调用 update
函数。
同样,这只是我在这里发表的 @ekhumoro 评论的冗长版本,所以问题不会得不到解答。