2012-09-05 252 views
1

我有一个可编辑的QTreeWidget,并希望在用户每次编辑项目时更新一些内部结构。但是,当某些项目发生更改时,没有特别发出信号。有itemChanged(),但它不仅在物品发生变化时发出,而且在创建时也发出。到目前为止,我无法找到区分这两种情况的优雅方法。在QTreeWidget中跟踪更改

我发明的唯一的解决办法是这样的:

# 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任何时候,我添加一个新的项目到树,这发生在代码中有很多地方。

回答

1

跟踪更改的一种方法是创建QTreeWidgetItem的子类并重新实现其功能setData函数。

的reimplemeted功能,可以再检查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)