我正在尝试对我的 QAbstractTableModel 实现进行单元测试。我已经实现了 rowCount()、columnCount() 和 data() 方法。
实例化我的模型后,无论嵌套多少次,父索引始终无效:
parent = model->index(0, 0);
i = model->index(0, 0, parent); // i.parent().IsValid() == false!
Run Code Online (Sandbox Code Playgroud)
现在,我是有效的。但 i.parent() 不是。即使我进一步嵌套:
ancestor = model->index(0, 0);
parent = model->index(0, 0, ancestor);
i = model->index(0, 0, parent); // i.parent().IsValid() == false!
Run Code Online (Sandbox Code Playgroud)
即便如此, i 是有效的,但 i.parent() 不是。
我已经对 rowCount 和 columnCount 方法进行了单元测试,并且我已经断言该模型是一个树模型,它有一行嵌套两行。此外,列数不为零。
为什么我的父索引总是无效?
这是一张桌子。它不应该是一棵树。因此,父项将始终无效。该QAbstractTableModel::index实现总是设置一个无效的父级,它应该如此。
您的期望适用于树模型,而不是表模型。如果给定的父元素有子元素,它们仅适用于树模型。您的测试错误地假设它正在使用的父级有子级,而实际上它没有。您可以轻松检查:model->hasChildren(parent)将始终返回false一个表。尝试使用无子父级创建索引是未定义的。理想情况下,您的模型应该对其进行断言。因此,对于树,您的测试通常也是错误的。
如果要实现一棵树,请从QAbstractItemModel. 然后,您将被迫正确实现bool hasChildren(const QModelIndex& parent) const- 这是树视图(和您的测试!)应该使用的方法来了解为给定父母的孩子请求索引是否有效。
一般来说,如果那样的model.hasChildren(parent) == false话,你永远不应该调用model.index(row, col, parent). 事实上,你的模型应该断言它是这样的:
QModelIndex MyModel::index(int row, int col, const QModelIndex & parent) {
Q_ASSERT(hasChildren(parent));
Q_ASSERT(row >= 0 && row < rowCount(parent));
Q_ASSERT(col >= 0 && col < columnCount(parent));
void * ptr = ...; // or quintptr ptr = ...;
return createIndex(row, col, ptr);
}
Run Code Online (Sandbox Code Playgroud)