我有一个多行和 0 列的QAbstractItemModel
。 我们开始使用ModelTest
类,它在这个模型上中断了。模型测试文档指出:
捕获的一些条件包括:
- hasChildren(( 如果 rowCount(( 大于零,则返回 true。
以下是Qt 5.11中has_children
的实现:
bool QAbstractItemModel::hasChildren(const QModelIndex &parent) const
{
return (rowCount(parent) > 0) && (columnCount(parent) > 0);
}
从此实现中,我们可以推断出,如果rowCount
返回大于零的值,ModelTest
期望columnCount
也返回大于零的值。
另一方面:
- 当不涉及
ModelTest
时,它看起来可以正常工作。 - 它没有记录在有孩子
- 它未记录在行计数中
- 它未记录在列计数中
- 它可以防止 beginRemoveColumn/endRemoveColumns 删除最后一列(当行数大于零时(。但我想在这种情况下可以重置模型。
所以最后是哪个:
ModelTest
是不是太挑剔了?- 我是否违反了一些我不知道的合同?
>ModelTest
只是为了测试一般陷阱而设计的。如果测试失败,这意味着您已经做了一些非常规的事情,可能会也可能不会有问题,具体取决于模型的使用方式。
确实,ModelTest
与文档规则相比稍微严格一些,因为模型被广泛使用,例如可以传递给自定义代理模型或视图实现。因此,这些检查是为了防止您执行可能破坏某些实现的不合逻辑的操作。
因此,只要您对此进行测试并且它与您使用它的视图一起工作,它就不会错,但它可能会在任何未来的Qt版本中崩溃,或者如果它与自定义代理/视图一起使用。
我的建议是尊重测试并重新实现hasChildren
方法以按预期运行,只是为了避免将来出现问题。毕竟,即使行没有列,它们仍然存在,因此索引确实有子项 - 这些子项只是空数据集,但它们确实存在!
这也意味着Qt对hasChildren
的实现是"错误的",因为他们应该在自己的实现中尊重这些东西 - 我的猜测是,这只是他们实现中的疏忽,因为他们没有考虑你的用例。