在 QAbstractItemModel 中 return 正数行和零列是否可以?
Is it ok to return a positive number of rows and zero columns in QAbstractItemModel?
我有一个包含多行和 0 列的 QAbstractItemModel
。
我们开始使用 ModelTest
class 并且它打破了这个模型。 ModelTest documentation 状态:
Some of the conditions caught include:
- hasChildren() returns true if rowCount() is greater then zero.
这里是has_children
在Qt 5.11中的实现:
bool QAbstractItemModel::hasChildren(const QModelIndex &parent) const
{
return (rowCount(parent) > 0) && (columnCount(parent) > 0);
}
从这个实现中,我们可以推断如果 rowCount
return 是一个大于零的值,ModelTest
期望 columnCount
到 return 一个大于也为零值。
另一方面:
- 在
ModelTest
不参与的情况下,它看起来工作正常。
- hasChildren
中没有记载
- rowCount
中没有记载
- columnCount
中没有记载
- 它可以防止 beginRemoveColumn / endRemoveColumns 删除最后一列(当行数大于零时)。但我想在这种情况下可以重置模型。
那么到底是哪个呢:
ModelTest
是不是太挑剔了?
- 我是否违反了一些我不知道的合同?
ModelTest
只是为了测试一般的陷阱而设计的。如果测试失败,这意味着您做了一些非常规的事情,这可能会或可能不会有问题,具体取决于模型的使用方式。
的确,ModelTest
作为文档规则稍微严格一些,因为模型被广泛使用,例如可以传递给自定义代理模型或视图实现。所以这些检查是为了防止你做一些可能破坏某些实现的不合逻辑的事情。
所以只要你测试它并且它与你使用它的视图一起工作,它就没有错,但它可能会在任何未来版本的 Qt 中崩溃,或者如果它与自定义一起使用 proxies/views .
我的建议是接受测试并重新实现 hasChildren
方法以按预期运行,以避免将来出现问题。毕竟,即使行没有列,它们仍然存在,所以索引确实有 children - 这些 children 只是空数据集,但它们确实存在!
这也意味着 Qt 对 hasChildren
的实现是 "wrong",因为他们应该在自己的实现中尊重这些东西——我猜这只是他们实现中的一个疏忽,因为他们没有考虑您的用例。
我有一个包含多行和 0 列的 QAbstractItemModel
。
我们开始使用 ModelTest
class 并且它打破了这个模型。 ModelTest documentation 状态:
Some of the conditions caught include:
- hasChildren() returns true if rowCount() is greater then zero.
这里是has_children
在Qt 5.11中的实现:
bool QAbstractItemModel::hasChildren(const QModelIndex &parent) const
{
return (rowCount(parent) > 0) && (columnCount(parent) > 0);
}
从这个实现中,我们可以推断如果 rowCount
return 是一个大于零的值,ModelTest
期望 columnCount
到 return 一个大于也为零值。
另一方面:
- 在
ModelTest
不参与的情况下,它看起来工作正常。 - hasChildren 中没有记载
- rowCount 中没有记载
- columnCount 中没有记载
- 它可以防止 beginRemoveColumn / endRemoveColumns 删除最后一列(当行数大于零时)。但我想在这种情况下可以重置模型。
那么到底是哪个呢:
ModelTest
是不是太挑剔了?- 我是否违反了一些我不知道的合同?
ModelTest
只是为了测试一般的陷阱而设计的。如果测试失败,这意味着您做了一些非常规的事情,这可能会或可能不会有问题,具体取决于模型的使用方式。
的确,ModelTest
作为文档规则稍微严格一些,因为模型被广泛使用,例如可以传递给自定义代理模型或视图实现。所以这些检查是为了防止你做一些可能破坏某些实现的不合逻辑的事情。
所以只要你测试它并且它与你使用它的视图一起工作,它就没有错,但它可能会在任何未来版本的 Qt 中崩溃,或者如果它与自定义一起使用 proxies/views .
我的建议是接受测试并重新实现 hasChildren
方法以按预期运行,以避免将来出现问题。毕竟,即使行没有列,它们仍然存在,所以索引确实有 children - 这些 children 只是空数据集,但它们确实存在!
这也意味着 Qt 对 hasChildren
的实现是 "wrong",因为他们应该在自己的实现中尊重这些东西——我猜这只是他们实现中的一个疏忽,因为他们没有考虑您的用例。