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

时间:2018-10-15 14:52:06

标签: c++ qt qtableview qabstractitemmodel

我有一个QAbstractItemModel,其中包含多行和0列。 我们开始使用ModelTest类,它在该模型上失效。 ModelTest documentation指出:

  

捕获的一些条件包括:

     
      如果rowCount()大于零,则
  • hasChildren()返回true。
  •   

这是Qt 5.11中has_children的实现:

bool QAbstractItemModel::hasChildren(const QModelIndex &parent) const
{
    return (rowCount(parent) > 0) && (columnCount(parent) > 0);
}

从此实现中,我们可以推断出,如果rowCount返回的值大于零,则ModelTest期望columnCount的返回值也大于零。

另一方面:

那么到底是什么

  • ModelTest太挑剔了吗?
  • 我违反了一些我不知道的合同吗?

1 个答案:

答案 0 :(得分:1)

ModelTest仅用于测试一般陷阱。如果测试失败,则意味着您所做的常规操作可能会出现问题,也可能不会出现问题,具体取决于模型的使用方式。

的确,ModelTest作为文档的规则稍微更严格,因为模型被广泛使用,并且可以例如传递给自定义代理模型或查看实现。因此,执行这些检查是为了防止您执行可能会破坏某些实现的不合逻辑的事情。

只要您对此进行了测试并能与您使用的视图一起使用,就没有错,但是它可能会在将来的任何Qt版本中或与自定义代理/视图一起使用时崩溃。

我的建议是尊重测试并重新实现hasChildren方法,使其表现出预期的效果,只是为了避免将来出现问题。毕竟,即使行没有列,它们仍然存在,因此索引确实有子级-这些子级只是空数据集,但它们确实存在!

这也意味着Qt对hasChildren的实现是“错误的”,因为他们应该在自己的实现中兑现这些东西-我猜这只是对实现的疏忽,因为他们没有考虑您的用例。