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

标签 c++ qt qtableview qabstractitemmodel

我有一个包含多行和 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 是不是太挑剔了?
  • 我是否违反了一些我不知道的契约(Contract)?

最佳答案

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

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

所以只要你测试它并且它与你使用它的 View 一起工作,它就没有错,但它可能会在任何 future 版本的 Qt 中崩溃,或者如果它与自定义代理/ View 一起使用。

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

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

关于c++ - 在 QAbstractItemModel 中返​​回正数行和零列是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52819434/

相关文章:

sqlite - Qt/QTableView/SQLite如何连接?

qt - QSortFilterProxyModel QTableView 5.3 不排序/更新?

c++ - QTableView 的 qt setItem 导致 "program not responding"

c++ - 在 C++ 的 O(1) 中使用哪个 STL 按值查找索引

c++ - 读取文件时的挣扎C++

连接到 MySQL 的 C++ 程序

c++ - QRegExpValidator 与 QTextEdit

c++ - 在 Eclipse/CDT 中抑制 "Unresolved Inclusion"警告?

c++ - 加载飞 map 像 "A device attached to the system is not functioning"

qt - QML:通过信号与曾祖 parent 沟通