QT QItemSelectionModel игнорировать столбцы?

Я пытаюсь ограничить выбор дерева определенным столбцом.

Я активно использую делегатов для создания пользовательских действий по каждому элементу за столбец, редакторам и т. Д. Я надеялся, что смогу каким-то образом сделать это от делегата, заблокировав событие или что-то подобное. Проблема в том, что, я думаю, мне нужно было бы создать полностью настраиваемое решение, которое имитирует расширенный выбор.

Тем не менее, после многих поисков и очень немногих примеров, похоже, что я хочу, чтобы пользовательский QItemSelectionModel отображался на моем древовидном представлении. Правильно ли это предположение?

Как создать пользовательскую QItemSelectionModel, которая будет использовать режим расширенного выбора, но позвольте мне игнорировать или отменять выделение, если не в определенном столбце. Другими словами, нажатие на другой столбец не должно изменять выбор (не следует выбирать или отменять выбор)

Я знаю, как добавить модель выбора, как только я ее получу. Я прошу помочь в реализации производного класса (если это не может быть сделано с подключенным сигналом).

Я использую Python, но буду ценить любую помощь.

Спасибо,

[EDIT:] Я нашел эти похожие вопросы: http://lists.qt.nokia.com/pipermail/qt-interest/2010-September/027647.html

« Подкласс QItemSelectionModel и переопределить оба метода выбора, чтобы иметь нужное поведение. Просто игнорируйте части диапазонов с помощью столбца> 0. … Или, возможно, просто переопределите флаги (), чтобы сделать элемент недоступным. Я не знаю, будут иметь какие-либо побочные эффекты ».

Я попытался переопределить флаги в моем QTreeWidgetItem, но он никогда не вызывался:

def flags(self, index): print index.column() return super(DDOutlinerBaseItem, self).flags(index) 

2 Solutions collect form web for “QT QItemSelectionModel игнорировать столбцы?”

Следующее изменение должно работать теоретически.

Вышеупомянутое решение может использовать два отдельных метода и декораторы @pyqtSlot для устранения неоднозначных имен перегруженных методов:

 @pyqtSlot(QModelIndex, QItemSelectionModel.SelectionFlags) def select(self, index, command): # ... @pyqtSlot(QItemSelection, QItemSelectionModel.SelectionFlags) def select(self, selection, command): #... 

Это позволяет избежать необходимости проверки экземпляров определенных классов в реализации метода.

Первое, что интересно, состоит в том, что, поскольку Python не может перегрузить метод, мой метод select просто вызывается дважды, один раз для каждого типа в аргументе 0. Вот пример, иллюстрирующий это, а также базовую настройку. Дерево моего QTreeWidget, которое он назвал «tree» ( self.tree )

  # in __init__ of my QTreeWidget: sel_model = ColumnSelectionModel(self.tree.model()) self.tree.setSelectionModel(sel_model) class ColumnSelectionModel(QtGui.QItemSelectionModel): def select(self, selection, selectionFlags): """ Runs both QItemSelectionModel.select methods:: 1. select(QtCore.QModelIndex, QItemSelectionModel.SelectionFlags) 2. select(QtGui.QItemSelection, QItemSelectionModel.SelectionFlags) The first seems to run on mouse down and mouse up. The second seems to run on mouse down, up and drag """ print("select(%s, %s)" % (type(selection), type(selectionFlags))) if isinstance(selection, QtGui.QItemSelection): infos = [] for index in selection.indexes(): infos.append(("index=%s row=%s column=%s" % (index, index.row(), index.column()))) print ", ".join(infos) elif isinstance(selection, QtCore.QModelIndex): index = selection print("index=%s row=%s column=%s" % (index, index.row(), index.column())) else: raise Exception("Unexpected type for arg 0: '%s'" % type(selection)) super(ColumnSelectionModel, self).select(selection, selectionFlags) 

Это, похоже, решает мою проблему:

 class ColumnSelectionModel(QtGui.QItemSelectionModel): def __init__(self, model): super(ColumnSelectionModel, self).__init__(model) self.selectable_columns = [0] """ Set the columns that are allowed to be selected """ def select(self, selection, selectionFlags): """ Ignores any selection changes if an item is not in one of the columns in the self.selectable_columns list. Is run by both QItemSelectionModel.select methods:: 1. select(QtCore.QModelIndex, QItemSelectionModel.SelectionFlags) 2. select(QtGui.QItemSelection, QItemSelectionModel.SelectionFlags) The first seems to run on mouse down and mouse up. The second seems to run on mouse down, up and drag """ if isinstance(selection, QtGui.QItemSelection): # This is the overload with the QItemSelection passed to arg 0 # Loop over all the items and if any are not in selectable_columns # ignore this event. This works because it is run for every change # so the offending selection index will always be the newest indexes = selection.indexes() for i in xrange(len(indexes)): index = indexes[i] if not index.column() in self.selectable_columns: return elif isinstance(selection, QtCore.QModelIndex): # This is the overload with the QModelIndex passed to arg 0 # If this index isn't in selectable_columns, just ignore this event index = selection if not index.column() in self.selectable_columns: return else: # Just in case raise Exception("Unexpected type for arg 0: '%s'" % type(selection)) # Fall through. Select as normal super(ColumnSelectionModel, self).select(selection, selectionFlags) 

В моей последней реализации я планирую делегировать решение моей системе делегатов, делая этот общий и, теоретически, способным динамически игнорировать любой индекс, который я хочу.

Python - лучший язык программирования в мире.