在listView按下“Space”键时触发setData()

问题描述 投票:0回答:1
我在 PySide6 中有一个小应用程序,它使用 Qt 模型视图。 Presenter继承自QAbstractItemModel。

当我按“空格”键时,会选中所选项目之一(在我的演示者模块中调用

setData()

),这不是故意行为。

我想做的是:

    使项目可供用户检查
  • 但避免通过空格键检查项目(因为当选择多个项目时,只会通过空格检查一个)

4 rows with checkboxes, boxes from 2 to 4 are selected

我没有设置任何捕获空格键的操作,我将编辑触发器设置为

NoEditTriggers

self.ui.listView.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
并检查它在应用程序生命周期内不会重置。

所以这是主要问题:我可以禁用或控制此行为,或者它可能是 PySide6 的一个错误?

还有辅助问题:我如何追踪,哪些方法调用了setData()

?目前,我在堆栈跟踪中仅看到 
setData()

提前谢谢您!

qt pyside6 model-view
1个回答
0
投票
我最终在

https://qtcentre.org/threads/21332-ItemIsUserCheckable-and-checking-all-selected-items找到了我的问题的一些答案。以下是有关此主题的一些注意事项:

    如果在 QListView 中使用扩展选择,并且项目是用户可检查的,则按“空格”将导致检查最后选定的项目。这不是 bug,对于 Qt 和 PySide 的 QListView 和 QListWidget 来说都是这样工作的;
  • 我发现没有简单的方法来改变这种行为(
  • setEditTriggers()
    不影响它);
  • 正如@musicamante所提到的,没有简单的方法来跟踪,在这种情况下该方法称为
  • setData()
解决方案

    如果您使用 PySide6-designer(或 Qt Creator),请为 QListView 选择“升级到...”选项并创建继承自 QListView 的转换类(否则,只需创建继承自 QListView 的自定义类),
  1. 在那里重新实现
  2. keyPressEvent()
     方法。例如,以下方式:
def keyPressEvent(self, event: QKeyEvent): if event.key() == Qt.Key.Key_Space: self._checkAllSelected() else: super().keyPressEvent(event)
这里 

_checkAllSelected()

 是新函数,它将处理项目检查。我按照以下方式实现了它:

def _checkAllSelected(self): model = self.model() indexes = self.selectedIndexes() setCheckState = Qt.CheckState.Unchecked for index in indexes: if model.data(index, Qt.ItemDataRole.CheckStateRole) == Qt.CheckState.Unchecked: setCheckState = Qt.CheckState.Checked break for index in indexes: model.setData(index, setCheckState.value, Qt.ItemDataRole.CheckStateRole)
现在可以管理多项选择时的项目检查。

© www.soinside.com 2019 - 2024. All rights reserved.