是否可以在 QAbstractItemModel 中返回正数行数和零列数?



我有一个多行和 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的实现是"错误的",因为他们应该在自己的实现中尊重这些东西 - 我的猜测是,这只是他们实现中的疏忽,因为他们没有考虑你的用例。

相关内容

  • 没有找到相关文章

最新更新