在 QAbstractItemModel 中返回正数行和零列是不是可以?
Posted
技术标签:
【中文标题】在 QAbstractItemModel 中返回正数行和零列是不是可以?【英文标题】:Is it ok to return a positive number of rows and zero columns in QAbstractItemModel?在 QAbstractItemModel 中返回正数行和零列是否可以? 【发布时间】:2018-10-15 14:52:05 【问题描述】:我有一个QAbstractItemModel
,其中包含多行和 0 列。
我们开始使用ModelTest
类,它在这个模型上中断了。 ModelTest documentation 状态:
捕获的一些条件包括:
如果 rowCount() 大于零,hasChildren() 返回 true。
这是has_children
在Qt 5.11中的实现:
bool QAbstractItemModel::hasChildren(const QModelIndex &parent) const
return (rowCount(parent) > 0) && (columnCount(parent) > 0);
从这个实现中,我们可以推断如果rowCount
返回一个大于零的值,ModelTest
期望columnCount
也返回一个大于零的值。
另一方面:
在不涉及ModelTest
的情况下,它似乎可以正常工作。
hasChildren 中没有记录
rowCount 中没有记录
columnCount 中没有记录
它防止beginRemoveColumn / endRemoveColumns 删除最后一列(当行数大于零时)。但我想在这种情况下模型可能会被重置。
那么到底是什么:
ModelTest
是不是太挑剔了?
我是否违反了一些我不知道的合同?
【问题讨论】:
0 列模型的用例是什么? (听起来很空 - 不知何故。);-) @Scheff 我有一个包含用户定义内容的表格。零列没有真正的用例,但是如果用户删除最后一个列,我不希望我的应用程序崩溃(例如,如果他想删除所有内容并从零开始) 【参考方案1】:ModelTest
只是为了测试一般陷阱而设计的。如果测试失败,这意味着您做了一些非常规的事情,可能有问题也可能没有问题,具体取决于模型的使用方式。
ModelTest
确实比文档的规则更严格,因为模型被广泛使用,例如可以传递给自定义代理模型或视图实现。所以这些检查是为了防止你做一些不合逻辑的事情,可能会破坏一些实现。
因此,只要您对此进行测试并且它适用于您使用它的视图,它就没有错,但它可能会在任何未来版本的 Qt 中崩溃,或者如果它与自定义代理/视图一起使用。
我的建议是兑现测试并重新实现 hasChildren
方法以按预期运行,只是为了避免将来出现问题。毕竟,即使行没有列,它们仍然存在,所以索引确实有孩子——这些孩子只是空数据集,但它们确实存在!
这也意味着 Qt 对 hasChildren
的实现是“错误的”,因为他们应该在自己的实现中尊重这些东西——我猜这只是他们实现中的疏忽,因为他们没有考虑到你的使用案例。
【讨论】:
我尝试重新实现 hasChildren,但它在 ModelTest 的另一个断言上失败了。当列数为零时,我最终隐藏了所有行。以上是关于在 QAbstractItemModel 中返回正数行和零列是不是可以?的主要内容,如果未能解决你的问题,请参考以下文章