Return 来自 QAbstractItemModel 的自定义用户类型

Return custom user type from QAbstractItemModel

我有一个 QAbstractItemModel 包装了一些自定义数据(指针向量)。我将此模型与 QSortFilterProxyModelQTreeView 等一起使用。

当将一些其他逻辑连接到 selectionChange 信号时,我需要用户数据。不是对它的一些看法,而是指针本身。

我在数据方法中添加了一个特例。 QVariant data(const QModelIndex &index, int role) const override

当我将 -1 作为 role 传递时,我 return 指向变体中我的用户类型的指针。这很 hacky,必须有更好的 "official" 方法来做到这一点。

return 如何从 QModelIndex 等中获取基础模型数据? 谢谢。

唯一的问题是您显式传递了一个整数。我一直使用 return 指向实际对象的模型,只需指定一个特定的 dataObject 角色,或者您选择如何命名它。

您当前的方式实际上与 Qt 建议使用的方式非常接近:您将 -1 作为角色传递给模型以 return 您的自定义数据,而 Qt 鼓励您使用另一个值作用:Qt::ItemDataRole 枚举以 Qt::UserRole 项等于 0x0100 结束。正如文档所说,它是第一个可用于特定应用程序目的的角色。因此,您可以传递 Qt::UserRole 而不是将 -1 传递给模型。如果您需要使用其他类型的特定于应用程序的数据,请使用 Qt::UserRole + 1 作为角色。对于其他人,您可以使用 Qt::UserRole + N.

然而,还有另一种方式:正如其中一条评论所指出的,如果您确实知道视图中使用了哪个模型,您可以简单地将 QAbstractItemModel 转换为您的特定模型并使用一些模型-具体API提取你需要的数据:

void MyView::selectionChanged(const QItemSelection & selected, const QItemSelection & deselect)
{
    MyModel * myModel = qobject_cast<MyModel*>(model());
    if (!myModel) {
        // Whoops, something went wrong, not the right model!
        <...> // process it somehow
        return;
    }

    <...> // Use myModel to retrieve the required data using convenient model-specific API
}

如果您需要从 QModelIndex 获取模型,只需使用 qobject_cast,如上图 QModelIndex::model() 所示。