Qt 改变前的价值?
我有一个modelQt 改变前的价值?,qt,pyqt,qtablewidget,Qt,Pyqt,Qtablewidget,我有一个modelQStandardItemModel并订阅itemChanged()信号,在那里我得到更改的项目 有没有办法在更改之前获取更改项的值 QtCore.QObject.connect(self, QtCore.SIGNAL("itemChanged(QStandardItem *)"), self.sModelChanged) 当QStandardItem发生更改时,没有标准的方式获得通知。但是,您可以轻松实现它: 创建从QStandardItem继承的新类 重新实现clo
QStandardItemModel
并订阅itemChanged()
信号,在那里我得到更改的项目
有没有办法在更改之前获取更改项的值
QtCore.QObject.connect(self, QtCore.SIGNAL("itemChanged(QStandardItem *)"), self.sModelChanged)
当
QStandardItem
发生更改时,没有标准的方式获得通知。但是,您可以轻松实现它:
- 创建从
继承的新类QStandardItem
- 重新实现
以从模型创建此类对象clone
- 重新执行
方法,并通知项目已更改。请参见下面的两种方法setData
- 将新类设置为模型的原型(
)setItemPrototype
QObject
继承您的item类,同时从setData
发出一个信号,并在某个地方订阅每个项(我不会这么做)itemAboutToChange
添加到QStandardItemModel
- 创建从
继承的新类QStandardItemModel
- 添加宏
和新信号Q\u对象
itemAboutToChange(QStandarItem*)
- 在从
派生的类的QStandardItem
中,调用模型中的信号李>setData
QMetaObject.invokeMethod(self.model(), "itemAboutToChange", Qt::DirectConnection, Q_ARG(QStandardItem*, self));
过去曾提到过这一点。(Qt,C++)
在阅读我的答案之前,我将展示如何在pyqt4中实现。这不是我的主意,但我将展示如何做到这一点
该类仅更改了
无效项(QStandardItem*)
。因此,您必须自己创建自定义信号
1) 对于这种情况,我建议使用继承类QtGui.QStandardItemModel
来创建自己的类,以实现在此更改之前获取更改项的值
2) 下一步,覆盖应该可以很好地跟踪更改的数据(但它不能在“承包商启动”中跟踪)
3) 并在设置数据之前创建自己的信号
实现的示例(PyQt4,Python)
对不起,你的工具是什么类的?是不是
QStandardItemModel
?是的,很抱歉我应该提到它。@Ezee:谢谢你的edit.return super(QtGui.QStandardItemModel,self)。setData(indexQModelIndex,afterValueQVariant,role)无法正常工作。我用return QtGui.QStandardItemModel.setData(self,indexQModelIndex,afterValueQVariant,role)替换这一行。噢!这是我的错。谢谢我在回答中修正了它。
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_())