在 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 只是为了测试一般的陷阱而设计的。如果测试失败,这意味着您做了一些非常规的事情,这可能会或可能不会有问题,具体取决于模型的使用方式。

的确,ModelTest 作为文档规则稍微严格一些,因为模型被广泛使用,例如可以传递给自定义代理模型或视图实现。所以这些检查是为了防止你做一些可能破坏某些实现的不合逻辑的事情。

所以只要你测试它并且它与你使用它的视图一起工作,它就没有错,但它可能会在任何未来版本的 Qt 中崩溃,或者如果它与自定义一起使用 proxies/views .

我的建议是接受测试并重新实现 hasChildren 方法以按预期运行,以避免将来出现问题。毕竟,即使行没有列,它们仍然存在,所以索引确实有 children - 这些 children 只是空数据集,但它们确实存在!

这也意味着 Qt 对 hasChildren 的实现是 "wrong",因为他们应该在自己的实现中尊重这些东西——我猜这只是他们实现中的一个疏忽,因为他们没有考虑您的用例。