Необязательный QListView
У меня есть 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)
Ответы
Ответ 1
Добавление строки:
self.listView.setEditTriggers(QAbstractItemView.NoEditTriggers)
должен исправить вещи для вас.
QListView
наследует QAbstractItemView
, который имеет метод setEditTriggers()
. Другие возможные значения для setEditTriggers
доступны в документации.
Ответ 2
Спасибо за ответы. Я закончил тем, что пошел с QListWidget
вместо этого, поскольку он не редактируется по умолчанию.
Хотя я также обнаружил, что если вы дадите QListView
событие двойного щелчка мыши и настроите его на выполнение чего-то другого, кроме редактирования QListView
, оно переопределяет функцию редактирования, так что это тоже работает.
Ответ 3
Если model
будет присоединена к нескольким представлениям, и вы не хотите, чтобы она была доступна для редактирования любым из них, вы можете QStringListModel
подкласс 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
из любого вида.
Ответ 4
QStringListModel
по определению редактируемый. Вы должны создать подкласс и предоставить соответствующие флаги