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)