2

私は編集可能QTreeWidgetで、ユーザーがアイテムを編集するたびにいくつかの内部構造を更新したいと思っています。ただし、一部のアイテムが変更された場合に特に発せられる信号はありません。ありますがitemChanged()、アイテムを変更したときだけでなく、作成したときにも放出されます。これまでのところ、2つのケースを区別するためのエレガントな方法を見つけることができません。

私が発明した唯一の解決策は次のようなものでした:

# 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

変更を追跡する1つの方法は、のサブクラスを作成し、その関数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 に答える