2009-10-27 288 views
4

这是一个Qt特定的问题。在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

听起来像一个合理的解决方案,因为它应该适用于任何你可能想要的模型作为实际的表模型,即。 SqlTableModel或只是一个普通的。只要您在用户编辑完成后添加行,并注意不要在用户未添加任何数据时添加该行。

1

你的解决方案似乎有点ha。。你的问题不仅仅是增加,它还是版本。当用户编辑一行时,会发生什么情况,甚至在用户提交他的版本之前,类型化数据会直接进入“数据层”?

更好的解决方案是限制你的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

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

顺便说一句,你仍可以通过将其放入一个新的表视图实现YourTableView内使用您的黑客,我的建议结合起来:

  1. QBlankRowModel重新实现 QAbstractTableModel 接口。它返回sourceModel.rowCount()+1作为QBlankRowModel::rowCount()。 它返回一个QVariant()如果n+1个行在QBlankRowModel::data()要求。 所有内QBlankRowModel其余部分被转发到sourceModel(用编辑 的n+1第i行QBlankRowModel缓冲和与完成时插入 sourceModel取代)。

  2. QTableViewYourTableView继承并包装sourceModelYourTableView::setModel(),呼吁 QTableView::setModel(QBlankRowModel(sourceModel))

因此,你的黑客被集中在一个地方。

相关问题