Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何构造具有有效父级的QModelIndex?_Qt - Fatal编程技术网

Qt 如何构造具有有效父级的QModelIndex?

Qt 如何构造具有有效父级的QModelIndex?,qt,Qt,我正在尝试对QAbstractTableModel的实现进行单元测试。我已经实现了rowCount()、columnCount()和data()方法 实例化我的模型后,无论嵌套深度有多深,父索引始终无效: parent = model->index(0, 0); i = model->index(0, 0, parent); // i.parent().IsValid() == false! 现在,我是有效的。但是i.parent()不是。 即使我做了进一步的嵌套: ancesto

我正在尝试对QAbstractTableModel的实现进行单元测试。我已经实现了rowCount()、columnCount()和data()方法

实例化我的模型后,无论嵌套深度有多深,父索引始终无效:

parent = model->index(0, 0);
i = model->index(0, 0, parent); // i.parent().IsValid() == false!
现在,我是有效的。但是i.parent()不是。 即使我做了进一步的嵌套:

ancestor = model->index(0, 0);
parent = model->index(0, 0, ancestor);
i = model->index(0, 0, parent); // i.parent().IsValid() == false!
即使这样,i也是有效的,但i.parent()不是

我对rowCount和columnCount方法进行了单元测试,并断言该模型是一个树模型,其中一行嵌套了两行。此外,列计数为非零


为什么我的父索引总是无效?

它是一个表。它不应该是一棵树。因此,父级将始终无效。
QAbstractTableModel::index
实现总是设置一个无效的父级,并且应该设置它

您的期望适用于树模型,而不是表模型。如果给定的父元素有子元素,则它们仅适用于树模型。您的测试错误地假设它使用的父级有子级,而它没有子级。您可以很容易地检查:
model->haschilds(parent)
对于表总是返回
false
。尝试创建具有无子级父级的索引未定义。理想情况下,您的模型应该在其上进行断言。因此,对于一棵树,您的测试通常也是错误的

如果要实现树,请从
qabstractemmodel
派生。然后将强制您正确实现
bool haschilds(const QModelIndex&parent)const
——这是树视图(和您的测试!)应该使用的方法,以了解为给定父级的子级请求索引是否有效

一般来说,如果
model.haschilds(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);
}
QModelIndex MyModel::index(int行、int列、常量QModelIndex&parent){
Q_断言(有子项(父项));
Q_断言(行>=0&&row=0&&col
是否确实设置了
i
s父级?如果要创建树模型,需要从
qabstracttemmodel
派生,而不是
QAbstractTableModel
,那么为什么可以将QAbstractTableModel与QTreeView一起使用呢?(例如这里)这些假设不也适用吗?另外,我使用的父对象确实有子对象,我实现了我的数据方法,因此它确实有子对象。你建议我如何前进?我是否覆盖::index方法?A
QTreeView
检查每个父级的子级,并且仅在子级存在时尝试创建子级索引。树状视图是显示表或列表模型的一种非常有效的方法。表/列表模型是一棵只有树干的树。“孩子”的确切定义是什么?我实现了data()方法,以便它检查父对象()并返回数据。那对我来说是个孩子#2.我还有什么选择?我找不到QAbstractTreeModel。从
QAbstractTableModel
派生的类必须是表。它不可能是一棵树。您希望从基类派生
qabstractemmodel
。您必须实现更多的方法-因为这些方法是由
QAbstractTableModel
为表实现的。子项是具有有效父项的索引的任何项,其父项必须返回
haschilds()==true
QAbstractTableModel
不支持此类模型,因为它是一个表,而不是一个树。