从QAbstractItemModel

时间:2018-06-12 22:41:40

标签: c++ qt qabstractitemmodel qmodelindex

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

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

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

当我将-1作为role传入时,我在变体中返回指向我的用户类型的指针。这是非常hacky,必须有一个更好的"官方"这样做的方法。

如何从QModelIndex返回基础模型数据等? 谢谢。

2 个答案:

答案 0 :(得分:3)

您当前的方式实际上与Qt建议使用的方式非常接近:您传递-1作为角色告诉模型返回您的自定义数据,而Qt鼓励您为角色使用另一个值:{{3枚举以Qt::UserRole项等于0x0100结束。正如文档所述,它是第一个可用于特定应用程序目的的角色。因此,不是将-1传递给模型,而是可以传递Qt::UserRole。如果您需要使用其他类型的特定于应用程序的数据,请使用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()

答案 1 :(得分:0)

关于它的唯一愚蠢的事情是你明确地传递一个整数。我使用的模型一直返回指向实际对象的指针,只需要指定一个特定的dataObject角色,或者你选择命名它。