2

我有一个可编辑的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每当我向树中添加新项目时,我都必须手动设置,这在代码中的很多地方都会发生。

4

1 回答 1

3

跟踪更改的一种方法是创建一个子类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)
于 2012-09-05T17:52:13.637 回答