Reputation: 3479
I have a QListView displaying a list of items but I don't want the items to be edited (Currently a double click on the item allows you to edit them).
This is my Code:
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)
Upvotes: 23
Views: 15784
Reputation: 13
In PySide6,
from PySide6.QtWidgets import QListView, QAbstractItemView
...
self.listview = QListView()
self.listview.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
Upvotes: 0
Reputation: 2203
QStringListModel
is by definition editable. You should subclass and provide the appropriate flags
Upvotes: 0
Reputation: 4510
Adding the line:
self.listView.setEditTriggers(QAbstractItemView.NoEditTriggers)
should fix things for you.
QListView
inherits QAbstractItemView
which has the method setEditTriggers()
. Other possible values for setEditTriggers
are available in the docs.
Upvotes: 49
Reputation: 3479
Thanks for the responses. I ended up going with a QListWidget
instead as it is not editable by default.
Though I also found if you give the QListView
a mouse Double clicked event and set it to do something other than edit the QListView
, it overrides the edit function so that works too.
Upvotes: 2
Reputation: 4364
If model
will be attached to multiple views and you don't want it to be editable by any of them, you can subclass QStringListModel
and override 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)
Now the user will not be able to edit model
from any view.
Upvotes: 0