过去引用此answer。 (Qt, C++)
在阅读我的答案之前,我展示了如何在 pyqt4 中实现。这不是我的主意,但我会展示如何做到这一点。
QtGui.QStandardItemModel 类只有 void itemChanged (QStandardItem*)。因此,您必须自己创建自定义信号。
1) 对于这种情况,我建议继承类QtGui.QStandardItemModel 创建自己的类来实现获取更改前的更改项的值。
2) 接下来,覆盖bool QStandardItemModel.setData (self, QModelIndex index, QVariant value, int role = Qt.EditRole) 应该可以跟踪更改的数据(但它无法在承包商启动时跟踪)。
3) 并在设置数据之前创建自己的信号;
实现的示例(PyQt4、Python);
import sys
from PyQt4 import QtGui, QtCore
class QNonStandardItemModel (QtGui.QStandardItemModel):
itemBeforeAndAfterChanged = QtCore.pyqtSignal(QtCore.QModelIndex, int, QtCore.QVariant, QtCore.QVariant)
def setData (self, indexQModelIndex, afterValueQVariant, role = QtCore.Qt.EditRole):
beforeValueQVariant = self.data(indexQModelIndex, role)
self.itemBeforeAndAfterChanged.emit(indexQModelIndex, role, beforeValueQVariant, afterValueQVariant)
return QtGui.QStandardItemModel.setData(self, indexQModelIndex, afterValueQVariant, role)
myQApplication = QtGui.QApplication([])
myQTreeView = QtGui.QTreeView()
headerQStandardItemModel = QNonStandardItemModel()
def callback (indexQModelIndex, role, beforeValueQVariant, afterValueQVariant):
print '#' * 80
print 'Before:', beforeValueQVariant.toString()
print 'After:', afterValueQVariant.toString()
print 'Role:', role
headerQStandardItemModel.itemBeforeAndAfterChanged.connect(callback)
headerQStandardItemModel.setHorizontalHeaderLabels([''] * 4)
myQTreeView.setModel(headerQStandardItemModel)
row1QStandardItem = QtGui.QStandardItem('ROW 1')
row1QStandardItem.appendRow([QtGui.QStandardItem(''), QtGui.QStandardItem('COLUMN 1'), QtGui.QStandardItem('COLUMN 2'), QtGui.QStandardItem('COLUMN 3')])
headerQStandardItemModel.appendRow(row1QStandardItem)
myQTreeView.show()
sys.exit(myQApplication.exec_())