У меня есть редактируемый 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
вручную в любое время я добавляю новый элемент в дерево, что происходит в довольно многих местах кода.
Одним из способов отслеживания изменений было бы создание подкласса 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)
Других решений пока нет …