我有一个包含多行和 0 列的 QAbstractItemModel
。
我们开始使用 ModelTest
类,但它打破了这个模型。 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
返回一个大于零的值,ModelTest
期望 columnCount
返回一个大于零的值也很有值(value)。
另一方面:
- 看起来它在不涉及
ModelTest
时工作正常。 - hasChildren 中没有记录
- rowCount 中没有记录
- columnCount 中没有记录
- 它阻止了beginRemoveColumn/endRemoveColumns从删除最后一列(当行数大于零时)。但我想在这种情况下可以重置模型。
那么到底是哪个呢:
ModelTest
是不是太挑剔了?- 我是否违反了一些我不知道的契约(Contract)?
最佳答案
ModelTest
只是为了测试一般的陷阱而设计的。如果测试失败,则意味着您做了一些非常规的事情,这可能会或可能不会有问题,具体取决于模型的使用方式。
ModelTest
确实比文档规则稍微严格一些,因为模型被广泛使用,例如可以传递给自定义代理模型或 View 实现。因此,这些检查是为了防止您做一些可能破坏某些实现的不合逻辑的事情。
所以只要你测试它并且它与你使用它的 View 一起工作,它就没有错,但它可能会在任何 future 版本的 Qt 中崩溃,或者如果它与自定义代理/ View 一起使用。
我的建议是接受测试并重新实现 hasChildren
方法以按预期运行,以避免将来出现问题。毕竟,即使行没有列,它们仍然存在,所以索引确实有子项——这些子项只是空数据集,但它们确实存在!
这也意味着 Qt 对 hasChildren
的实现是“错误的”,因为他们应该在自己的实现中尊重这些东西——我猜这只是他们实现中的一个疏忽,因为他们没有考虑您的用例。
关于c++ - 在 QAbstractItemModel 中返回正数行和零列是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52819434/