Отслеживание изменений в QTreeWidget

У меня есть редактируемый QTreeWidget и хотите обновить некоторые внутренние структуры каждый раз, когда пользователь редактирует элемент. Тем не менее, при смене какого-либо элемента сигнал не выдается. Есть itemChanged(), но он излучается не только при смене элемента, но и при созданный также. Пока что я не могу найти элегантный способ отличить два случая.

Единственное решение, которое я изобрел, было что-то вроде этого:

# slot for itemClicked()
def EditName(self, item, column):
self.oldname = item.text(0)

# slot for itemChanged()
def RenameFile(self, item, column):
newname = item.text(0)
if newname != self.oldname:
# Do something with newname here

Тем не менее, это не очень удобно, потому что мне придется установить self.oldname вручную в любое время я добавляю новый элемент в дерево, что происходит в довольно многих местах кода.

2

Решение

Одним из способов отслеживания изменений было бы создание подкласса QTreeWidgetItem и переопределить его setData функция.

Повторно реализованная функция может затем проверить role Аргумент, чтобы увидеть, какое действие предпринять:

class TreeWidgetItem(QtGui.QTreeWidgetItem):
def __init__(self, *args, **kwargs):
QtGui.QTreeWidgetItem.__init__(self, *args, **kwargs)
self.setFlags(self.flags() | QtCore.Qt.ItemIsEditable)

def setData(self, column, role, value):
if role == QtCore.Qt.EditRole:
# do important stuff here...
print 'before: "%s", after: "%s"' % (
self.text(column), value.toString())
QtGui.QTreeWidgetItem.setData(self, column, role, value)
2

Другие решения

Других решений пока нет …