【问题标题】:In index, why check if item already has an index? (Qt)在索引中,为什么要检查项目是否已经有索引? (Qt)
【发布时间】:2014-12-18 10:30:51
【问题描述】:

短版

在为树模型重新实现index 时,为什么我们要先检查相关项是否已经有索引(使用hasIndex),如果没有则返回根索引?为该项目创建索引不是重点吗?

详细版

考虑在 PySide 的 simpletreemodel 示例中重新实现 index(完整代码如下)。我的理解是index 方法旨在获取特定项目的行、列和父索引,并使用createIndex 返回该项目的索引。但是index 方法以以下几行打开:

    if not self.hasIndex(row, column, parent):
        return QtCore.QModelIndex()

我在这里有点困惑。如果项目没有已经有效索引,为什么要返回根索引?这种方法首先是如何创建索引的?当我剪掉以上几行时,我在应用程序中看不到任何有害影响。

由于我试图尽可能简化 PySide 示例,因此我只想删除这两行。这会产生不可预见的不良后果吗?

相关代码

def index(self, row, column, parent):
    if not self.hasIndex(row, column, parent):
        return QtCore.QModelIndex()
    if not parent.isValid():
        parentItem = self.rootItem
    else:
        parentItem = parent.internalPointer()
    childItem = parentItem.child(row)
    if childItem:
        return self.createIndex(row, column, childItem)
    else:
        return QtCore.QModelIndex()

【问题讨论】:

    标签: qt pyqt pyside


    【解决方案1】:

    hasIndex 函数只执行边界检查。如果rowcolumn 参数小于零,或者超出parent 索引的行数或列数范围,它将返回False;否则,它将返回True

    另外,在示例实现中,index 方法在 hasIndex 返回 false 时不返回根索引:它返回 invalid 索引(@987654321 的无参数构造函数@ 总是创建一个无效的索引)。当正在建模的数据中没有可用的对应项时,模型应始终返回无效索引。

    【讨论】:

    • 非常感谢 - 我很困惑 b/c 文档所说的 hasIndex:“如果模型为 rowcolumnparent 返回有效的 QModelIndex,则返回 true ,否则返回假。”这使它看起来等同于isValid。您是如何从 Qt 源代码 (qabstractitemmodel.cpp) 中发现这一点的?
    • 我认为根索引无效索引(即QtCore.QModelIndex())。我见过一些作者。例如,Summerfield (Rapid Gui Programming) 写道,“在树模型中,每个项目要么是另一个项目的子项目(因此有一个父项目),要么是顶级 ( root) 项目,在这种情况下它没有父项,这由无效的模型索引表示。 因此,当我们使用 QModelIndex()(即,使用无效的模型索引)调用 columnCount() 时,我们得到顶级项目的列数”(第 495 页,已添加重点)。
    • @neuronet。 Qt 文档不是特别清楚,但只有hasIndex 进行某种边界检查才有意义。始终值得阅读源代码以检查您的假设是否正确 :) 至于根索引:它必须是无效的,因为与所有无效索引一样,它不代表数据中的任何项目。
    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2021-12-29
    • 2021-07-22
    相关资源
    最近更新 更多