在Qt中,创建一个包含空白可编辑行的表

时间:2009-10-27 00:35:28

标签: qt qt4

这是一个特定于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 ) ;

欢迎任何建议。感谢。

3 个答案:

答案 0 :(得分:3)

从设计角度来看,这应该是视图的一部分,而不是模型。因此,我建议使用该功能实现一个视图,并保持模型不变。 KOffice Kexi仅使用kexitableviewscreenshotdocumentation)执行此操作。也许你想使用他们的一些代码。

顺便说一句,你可能仍然可以使用你的hack并将它与我的建议结合起来,将它放在一个新的表视图实现中YourTableView

  1. QBlankRowModel重新实现了 QAbstractTableModel 接口。它将sourceModel.rowCount()+1作为QBlankRowModel::rowCount()返回。 如果在QVariant()中请求n+1行,则返回QBlankRowModel::data()QBlankRowModel中的所有其余内容都会转发到sourceModel(进行修改) n+1中的QBlankRowModel行被缓冲并替换为插入到sourceModel中 完成后YourTableView

  2. 新的QTableView继承自 sourceModel并将QTableView::setModel(QBlankRowModel(sourceModel))包裹在内 YourTableView::setModel(),打电话 {{1}}。

  3. 因此,您的黑客在某一点被本地化。

答案 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或只是一个简单的。只要在用户完成编辑时添加行,并在用户未添加任何数据时注意不要添加行。