我有一个可编辑的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
,这在代码的很多地方都会发生
答案 0 :(得分: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)