Не редактируемый QListView - PullRequest
11 голосов
/ 03 июня 2011

У меня есть 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 ]

31 голосов
/ 03 июня 2011

Добавление строки:

self.listView.setEditTriggers(QAbstractItemView.NoEditTriggers)

должен все исправить.

QListView наследует QAbstractItemView, который имеет метод setEditTriggers (). Другие возможные значения для setEditTriggers доступны в документации.

0 голосов
/ 03 апреля 2019

Если 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 из любого вида.

0 голосов
/ 05 июня 2011

Спасибо за ответы. Вместо этого я выбрал QListWidget, так как по умолчанию он не редактируется.

Хотя я также обнаружил, что если вы дадите QListView событие мыши с двойным щелчком мыши и настроите его на что-то иное, чем редактирование QListView, оно переопределяет функцию редактирования, поэтому она тоже работает.

0 голосов
/ 04 июня 2011

QStringListModel по определению редактируемый.Вы должны создать подкласс и предоставить соответствующие flags

...