0

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

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

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

当我将 -1 作为 a 传入时role,我返回一个指向变体中我的用户类型的指针。这很hacky,必须有更好的“官方”方式来做到这一点。

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

4

2 回答 2

2

您当前的方式实际上非常接近 Qt 建议使用的方式:您将 -1 作为角色传递,以告诉模型返回您的自定义数据,而 Qt 鼓励您为角色使用另一个值:Qt::ItemDataRole enumeration ends项目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()

于 2018-06-13T09:29:01.300 回答
0

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

于 2018-06-13T09:26:14.610 回答