这是一个特定于Qt的问题。
通过在表格底部的空行中键入内容,可以方便地将新数据添加到表格中。提交数据时,会向表中添加一个新的空白行。
有没有人找到一种以通用方式实现这一点的方法,这适合Qt的模型 - 视图编程架构?我最接近的尝试涉及创建代理模型,以便从模型返回的rowCount()
总是比源模型大一个。
QAbstractTableModel* sourceModel ; // Data is stored here
QBlankRowModel* model ; // Proxy model that adds one to rowCount()
QTableView* view ; // View
view->setModel( model ) ;
model->setSourceModel( sourceModel ) ;
欢迎任何建议。感谢。
答案 0 :(得分:3)
从设计角度来看,这应该是视图的一部分,而不是模型。因此,我建议使用该功能实现一个视图,并保持模型不变。 KOffice Kexi仅使用kexitableview(screenshot,documentation)执行此操作。也许你想使用他们的一些代码。
顺便说一句,你可能仍然可以使用你的hack并将它与我的建议结合起来,将它放在一个新的表视图实现中YourTableView
:
QBlankRowModel
重新实现了
QAbstractTableModel
接口。它将sourceModel.rowCount()+1
作为QBlankRowModel::rowCount()
返回。
如果在QVariant()
中请求n+1
行,则返回QBlankRowModel::data()
。
QBlankRowModel
中的所有其余内容都会转发到sourceModel
(进行修改)
n+1
中的QBlankRowModel
行被缓冲并替换为插入到sourceModel
中
完成后YourTableView
。
新的QTableView
继承自
sourceModel
并将QTableView::setModel(QBlankRowModel(sourceModel))
包裹在内
YourTableView::setModel()
,打电话
{{1}}。
因此,您的黑客在某一点被本地化。
答案 1 :(得分:1)
你的解决方案看起来有些晦涩难懂。你的问题不仅仅是补充,它也是版本。当用户编辑一行时会发生什么情况,即使在用户提交其版本之前,键入的数据也会直接进入“数据层”?
更好的解决方案是限制sourceModel的角色。它不应该是数据的“直接”表示,而应该是它的“缓冲”表示。创建sourceModel后,您可以在某种Row()实例中复制数据。拥有自己的数据副本的sourceModel可以自由地播放,执行版本和添加,并且只有在用户提交编辑时才将数据提交到模型层。
如果您想要这样一个表的PyQt示例,您可以查看我的项目的来源:
http://hg.hardcoded.net/moneyguru/
你可能不得不四处寻找“缓冲”逻辑,因为它不在PyQt代码本身,而是代码的“跨平台”部分:
http://hg.hardcoded.net/moneyguru/src/tip/core/gui/table.py
然后在我的QAbstractItemModel子类中使用此逻辑:
http://hg.hardcoded.net/moneyguru/src/tip/qt/controller/table.py
答案 2 :(得分:0)
听起来像是一个合理的解决方案,因为它应该适用于您可能想要作为实际表模型的任何模型,即。 SqlTableModel或只是一个简单的。只要在用户完成编辑时添加行,并在用户未添加任何数据时注意不要添加行。