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

Posted

技术标签:

【中文标题】在 QAbstractItemModel 中返​​回正数行和零列是不是可以?【英文标题】:Is it ok to return a positive number of rows and zero columns in QAbstractItemModel?在 QAbstractItemModel 中返​​回正数行和零列是否可以? 【发布时间】:2018-10-15 14:52:05 【问题描述】:

我有一个QAbstractItemModel,其中包含多行和 0 列。 我们开始使用ModelTest 类,它在这个模型上中断了。 ModelTest documentation 状态:

捕获的一些条件包括:

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

这是has_children在Qt 5.11中的实现:

bool QAbstractItemModel::hasChildren(const QModelIndex &parent) const

    return (rowCount(parent) > 0) && (columnCount(parent) > 0);

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

另一方面:

在不涉及ModelTest 的情况下,它似乎可以正常工作。 hasChildren 中没有记录 rowCount 中没有记录 columnCount 中没有记录 它防止beginRemoveColumn / endRemoveColumns 删除最后一列(当行数大于零时)。但我想在这种情况下模型可能会被重置。

那么到底是什么:

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

【问题讨论】:

0 列模型的用例是什么? (听起来很空 - 不知何故。);-) @Scheff 我有一个包含用户定义内容的表格。零列没有真正的用例,但是如果用户删除最后一个列,我不希望我的应用程序崩溃(例如,如果他想删除所有内容并从零开始) 【参考方案1】:

ModelTest 只是为了测试一般陷阱而设计的。如果测试失败,这意味着您做了一些非常规的事情,可能有问题也可能没有问题,具体取决于模型的使用方式。

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

因此,只要您对此进行测试并且它适用于您使用它的视图,它就没有错,但它可能会在任何未来版本的 Qt 中崩溃,或者如果它与自定义代理/视图一起使用。

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

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

【讨论】:

我尝试重新实现 hasChildren,但它在 ModelTest 的另一个断言上失败了。当列数为零时,我最终隐藏了所有行。

以上是关于在 QAbstractItemModel 中返​​回正数行和零列是不是可以?的主要内容,如果未能解决你的问题,请参考以下文章

如何在模型 Laravel 中返​​回多个自定义值

如何在 Laravel 中返​​回数据库表名

在 Laravel 中返​​回多对多关系的统一 JSON

在 Excel 中返​​回具有不同行长的最大值

使用邮递员的 PUT/PATCH 请求在 Laravel 中返​​回状态码 0

如何在Web API中返回响应时隐藏模型的各个部分?