我正在使用Qt5编写一个程序,它在Linux上运行得很好,但在Windows上,我观察到了奇怪的行为:
当QTreeView::setModel被调用时,它向模型请求索引(QAbstractItemModel::index),其中包含一些行和类以及无效的父级。这种情况在Linux上从来没有发生过,在调用hasChildren之前,视图总是询问index、rowCount等。
我已经下载了Qt5的源代码来查看发生了什么,我可以看到:
// These asserts do basic sanity checking of the model
Q_ASSERT_X(d->model->index(0,0) == d->model->index(0,0),
"QAbstractItemView::setModel",
"A model should return the exact same index "
"(including its internal id/pointer) when asked for it twice in a row.");
Q_ASSERT_X(!d->model->index(0,0).parent().isValid(),
"QAbstractItemView::setModel",
"The parent of a top level index should be invalid");在视图类或模型类的文档中,我找不到关于这些正确性检查的一个字。
它们的定义在哪里?
这里另一件有趣的事情是,我可以通过观察模型/视图类来推断,我编写的顶级索引应该是无效的,但是我无法在docs中直接找到这些信息。
发布于 2018-07-11 07:19:20
来自QAbstractItemModel::parent()的文档
如果项目没有父项,则返回无效的QModelIndex。
这意味着使用无效的index()调用QModelIndex将请求顶级项。
您遇到的正常检查可能已经在Linux中禁用(可能是版本构建?)-但是您的模型的功能不应该依赖于函数调用的顺序。
如果使用无效的行/列参数调用index() (如果模型尚未填充),则返回QModelIndex()。
https://stackoverflow.com/questions/25326875
复制相似问题