我创建了QTreeWidget
,显示了从第三方API调用中提取的数据。
当用户点击或使用箭头键导航到任何QTreeWidgetItem
时,我希望数据是新鲜的。这意味着每次用户单击或使用箭头键时都会进行API调用。重要的是:如果用户第二次点击同一项目,我希望该项目显示新数据(换句话说,进行另一个API调用并填充新数据,即刷新)
到目前为止,我已经尝试过了:
itemSelectionChanged
和itemClicked
连接到同一更新功能。这有效,但这意味着对于新QTreeWidgetItem
的每次点击,我都会有两次调用更新函数(一个来自itemClicked
,另一个来自itemSelectionChanged
),因此有两个API调用完全相同的事情。不理想。itemClicked
,然后使用事件过滤器查找Key_Up
或Key_Down
,然后手动发出itemClicked
。这个问题是在更改选择之前处理了键事件,因此在使用箭头键时,我总是获取所选 last QTreeWidgetItem
的数据,而不是当前QTreeWidgetItem
。我考虑过创建一个非常短的计时器或一个标志,并在更新功能的开始时启动/设置。如果计时器正在运行或设置了标志,则不要运行该功能(这个想法是第一个插槽将运行,但第二个插槽不会因为标志设置/计时器正在运行),但这似乎都是草率,容易出现竞争条件。
不幸的是,使用带有QTreeView
的{{1}}不是一种选择。
有了这个,有没有办法处理同一项目的重复点击和箭头键选择新项目而不需要双重调用相同的更新功能?
答案 0 :(得分:0)
正如@ekhumoro指出的那样,这可以通过处理itemClicked
和itemSelectionChanged
来完成,但是引入一些逻辑,以便两个函数不会同时运行。
当用户点击窗口小部件时,会触发itemClicked
信号。当用户更改选择时,将触发itemSelectionChanged
信号。在我的情况下,我创建了两个插槽(功能):update
(itemSelectionChanged
的插槽)和updateFromClick
(itemClicked
的插槽)。 updateFromClick
检查选择是否已更改(这意味着您始终必须存储并跟踪当前选择)。如果在updateFromClick
中,我看到选择已更改,那么我什么都不做,因为update
将从itemSelectionChanged
调用。如果在updateFromClick
中,我发现选项没有更改,我知道itemSelectionChanged
未被触发,因此我从update
明确调用updateFromClick
函数。< / p>
同样,这只是@ ekhumoro评论中的一个冗长版本,我正在这里放置,所以这个问题没有得到解答。