PyQt5允许在编辑时选择QListView项目

时间:2018-02-14 21:13:38

标签: python pyqt pyqt5 qlistview qitemdelegate

我正在尝试获取点击事件(最终左,右和双击)以“通过”编辑器窗口小部件到底层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()?

1 个答案:

答案 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)