不可编辑的 QListView

22

我有一个显示项目列表的QListView,但我不希望这些项目被编辑(当前情况下,双击项目可以编辑它们)。

这是我的代码:

self.listView = QListView()
self.model = QStringListModel([ "item1" , "item2" , "item3" ])
self.listView.setModel( self.model )

self.layout = QGridLayout()  
self.layout.addWidget(self.listView, 0 , 0 )
self.setLayout(self.layout)
4个回答

48

添加以下行:

self.listView.setEditTriggers(QAbstractItemView.NoEditTriggers)

这应该可以为你解决问题。

QListView 继承自 QAbstractItemView,后者具有 setEditTriggers() 方法。文档中还提供了其他 可用于 setEditTriggers 的值。


1
这更像是一种黑客方式,因为它仍然可以被编辑,只是不能通过这个特定的视图进行编辑。 - gwohpq9
1
listView.setEditTriggers(QAbstractItemView::NoEditTriggers); 用于 C++ Qt。 - user10609288

2
感谢您的回复。最终我选择了QListWidget,因为它默认情况下是不可编辑的。
虽然我也发现如果给QListView设置鼠标双击事件,并将其设置为执行其他操作而不是编辑QListView,它会覆盖编辑功能,所以这也可以。

使用QListWidget是一个很好的解决方案。 - Rida Shamasneh

0

QStringListModel 是可编辑的。您应该创建子类并提供适当的标志


1
链接已损坏。 - Ayxan Haqverdili
2011年的存档链接在此:https://web.archive.org/web/20110807124820/http://doc.qt.nokia.com/latest/qabstractitemmodel.html#flags - dbc

0

如果model将附加到多个视图,并且您不希望任何一个视图可以编辑它,您可以继承QStringListModel并覆盖flags()

from PyQt5.QtCore import Qt

class UneditableStringListModel(QStringListModel):

    def flags(self, index):
        return Qt.ItemIsSelectable & Qt.ItemIsEnabled


listView = QListView()
model = UneditableStringListModel([ "item1" , "item2" , "item3" ])
listView.setModel(model)

现在用户将无法从任何视图中编辑model


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接