Необязательный 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 по определению редактируемый. Вы должны создать подкласс и предоставить соответствующие флаги