我正在尝试获取点击事件(最终左,右和双击)以“通过”编辑器窗口小部件到底层QListView,以便可以进行选择。想法的事件过滤器可能是要走的路,但是我对于eventFilter(对象,事件)函数和installEventFilter()调用需要去哪里以使其发生时有点困惑。
在我的情况下,我使用自定义委托类在我的QListView中绘制我的数据,并使用编辑器根据光标位置更新模型。我希望这只是一直活跃,所以我在输入项目后让我的QListView激活编辑器。
dataView=QListView(self)
dataView.setGeometry(self.rect())
dataView.setViewMode(1)
dataView.setMovement(0)
dataView.setSelectionMode(QAbstractItemView.ExtendedSelection)
dataView.setMouseTracking(True)
dataView.entered.connect(dataView.edit)
delegate=CustomDelegate(self)
dataModel=QStandardItemModel(self)
dataView.setModel(dataModel)
dataView.setItemDelegate(delegate)
这样做的缺点是当你的鼠标在一个项目上时,它现在由编辑器小部件覆盖,我相信它正在收集鼠标点击数据,从而阻止点击选择QListView中的项目。
在我的委托中,我让它创建编辑器并连接信号以更新模型中的数据(框架)以更改委托显示的方式并关闭编辑器
def createEditor(self,parent,option,index):
editor=TestEditor(parent)
editor.editingFinished.connect(self.deleteEditor)
editor.updateFrame.connect(self.updateFrames)
return editor
我会在哪里创建我的事件过滤器?在我主要生成QListView的地方?在自定义QListView中?在我的代表中?或者在我的编辑器小部件中然后我会在哪里调用installEventFilter()?
答案 0 :(得分:0)
事实证明,在我的情况下,QListView没有响应选择点击,因为当你调用edit()函数时,查看器的状态变为“QAbstractItemView.EditingState”,在这种状态下,显然选择被禁用。我只是将QListView子类化并添加了一个beginEdit函数。
class CustomList(QListView):
def __init__(self,parent=None):
super().__init__(parent)
def beginEdit(self,index):
state=self.state()
self.edit(index)
self.setState(state)
然后只是将其连接起来而不是编辑。
dataView=CustomList(self)
dataView.entered.connect(dataView.beginEdit)