跟踪QTreeWidget中的更改

时间:2012-09-05 11:23:06

标签: c++ python qt4 pyqt4

我有一个可编辑的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,这在代码的很多地方都会发生

1 个答案:

答案 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)