Qt 如何使用QAbstractTableModel.submit\revert方法?

Qt 如何使用QAbstractTableModel.submit\revert方法?,qt,pyqt,pyside,Qt,Pyqt,Pyside,我正在尝试使用自己的QAbstractTableModel-子类和QTableView在网格中编辑记录。编辑完成后,模型将收到一个信号,发送到它的submit()或revert()插槽。但是没有参数,因此模型不知道需要提交(刷新)数据存储的记录。我试图通过捕获model.setData()/removeRows()/insertRows()来设置自己的更改跟踪,但这有点混乱。有正确的方法吗?根据QAbstractTableModel上的文档: 子类化 在子类化QAbstractTableMode

我正在尝试使用自己的
QAbstractTableModel
-子类和
QTableView
在网格中编辑记录。编辑完成后,模型将收到一个信号,发送到它的
submit()
revert()
插槽。但是没有参数,因此模型不知道需要提交(刷新)数据存储的记录。我试图通过捕获
model.setData()/removeRows()/insertRows()
来设置自己的更改跟踪,但这有点混乱。有正确的方法吗?

根据
QAbstractTableModel
上的文档:

子类化

在子类化QAbstractTableModel时,必须实现rowCount(), columnCount()和data()。index()和 parent()函数由QAbstractTableModel提供。乖 模型还将实现headerData()

可编辑模型需要实现setData(),并实现flags()以 返回一个包含Qt.ItemIsEditable的值

因此,您正在实现
setData
removows
insertRows
是合适的。该类的其他子类也使用它们自己的内部缓存来跟踪正在更改的内容,以便在需要时将其提交给数据源。如果到目前为止你的方法一团糟,那么你可能只需要改进你正在做的事情,因为这条路是正确的


setData
用于跟踪内部数据结构中发生的更改。因此,例如,如果您的模型在内部是一个基本字典,并且将提交给基于web的REST服务,那么您将管理内部字典中数据的更改。当调用
submit
时,您将使用该内部缓存进行必要的REST调用,以发送数据并同步数据。

那么您使用的是哪个
QAbstractTableModel
后代?其中一些已经在跟踪行的更改,当当前行从视图完成编辑时,将调用submit。或者你只是从
QAbstractTableModel
子类化了你自己的吗?是的,我只是从QAbstractTableModel子类化了我自己的。我知道我自己可以实现跟踪,我只是质疑这样做的必要性,只是为了知道哪一行用户刚刚完成编辑。QTableView完全清楚这一点,因为它发出了恢复\提交插槽的信号,但并没有放弃该信息。这看起来像是Qt开发人员的疏忽。但哦,好吧…@AlexVhr:我不认为这是疏忽<代码>提交不一定以行编辑的1对1方式触发。您的视图可以选择在编辑10行时调用它。在这种情况下,它与一行没有关联。因此,由于这个类是一个抽象类,您需要使用
setData
自己跟踪它,因为它正在被积极编辑。因为模型与视图是分开的,所以它并不假装知道视图将如何设计。模型-是的,但视图知道,因为它通知模型有关编辑,但对细节闭嘴,因此,我们不得不从模型内部推断视图中发生了什么。是什么阻止了您自定义视图以准确发出所需信息并将其连接到模型以通知它?什么都没有。如果需要,一切都可以手动实现,只是存在revert\submit插槽和文档中的一句话(“此函数通常用于行编辑”)让我希望它已经实现。