PyQt5 允许在编辑时选择 QListView 项目
PyQt5 allow selection of QListView items while editing
我正在尝试将点击事件(最终是左键单击、右键单击和双击)"pass through" 编辑器小部件发送到基础 QListView,以便可以进行选择。图事件过滤器可能是可行的方法,但我对 eventFilter(object,event) 函数和 installEventFilter() 调用需要去哪里才能实现这一点感到有点困惑。
就我而言,我使用自定义委托 class 在 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()?
事实证明,在我的案例中,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)
我正在尝试将点击事件(最终是左键单击、右键单击和双击)"pass through" 编辑器小部件发送到基础 QListView,以便可以进行选择。图事件过滤器可能是可行的方法,但我对 eventFilter(object,event) 函数和 installEventFilter() 调用需要去哪里才能实现这一点感到有点困惑。
就我而言,我使用自定义委托 class 在 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()?
事实证明,在我的案例中,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)