Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 改变前的价值?_Qt_Pyqt_Qtablewidget - Fatal编程技术网

Qt 改变前的价值?

Qt 改变前的价值?,qt,pyqt,qtablewidget,Qt,Pyqt,Qtablewidget,我有一个modelQStandardItemModel并订阅itemChanged()信号,在那里我得到更改的项目 有没有办法在更改之前获取更改项的值 QtCore.QObject.connect(self, QtCore.SIGNAL("itemChanged(QStandardItem *)"), self.sModelChanged) 当QStandardItem发生更改时,没有标准的方式获得通知。但是,您可以轻松实现它: 创建从QStandardItem继承的新类 重新实现clo

我有一个model
QStandardItemModel
并订阅
itemChanged()
信号,在那里我得到更改的项目

有没有办法在更改之前获取更改项的值

QtCore.QObject.connect(self, QtCore.SIGNAL("itemChanged(QStandardItem *)"), self.sModelChanged)  

QStandardItem
发生更改时,没有标准的方式获得通知。但是,您可以轻松实现它:

  • 创建从
    QStandardItem
    继承的新类
  • 重新实现
    clone
    以从模型创建此类对象
  • 重新执行
    setData
    方法,并通知项目已更改。请参见下面的两种方法
  • 将新类设置为模型的原型(
    setItemPrototype
有两种方法可以更进一步:

  • QObject
    继承您的item类,同时从
    setData
    发出一个信号,并在某个地方订阅每个项(我不会这么做)
  • 将信号
    itemAboutToChange
    添加到
    QStandardItemModel
  • 我将展开第2部分:

    • 创建从
      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_())