【问题标题】:How to access QStandardItemModel and it's data using a QModelIndex?如何使用 QModelIndex 访问 QStandardItemModel 及其数据?
【发布时间】:2014-06-07 10:36:37
【问题描述】:

我有一个clicked()-signal,它知道QModelIndex 类型的选定索引。

void onListClicked(const QModelIndex & index) { /* ... */ }

不,我想访问被点击项目的数据。我发现我可以使用model() 访问模型:

void onListClicked(const QModelIndex & index)
{
    QStandardItemModel * model {index.model()};
}

但这失败了,因为 model() getter 只允许我返回 QAbstractItemModel

error: invalid conversion from 'const QAbstractItemModel*' to 'QStandardItemModel*' [-fpermissive]

如何访问QStandardItemModel 甚至更好的选择QStandardItem?我的唯一标识符存储在QStandardItem::data()

我需要的是这样的:

void onListClicked(const QModelIndex & index)
{
    QStandardItemModel * model {index.model()};
    QStandardItem * item {model->itemFromIndex(index)};
    qDebug() << item->data().toString();
}

但这不起作用。为什么这么难。我在这里想念什么?

【问题讨论】:

    标签: c++ qt oop model qt5


    【解决方案1】:

    我认为你可以直接从模型索引中获取数据:

    void onListClicked(const QModelIndex & index) {
        index.data(Qt::UserRole + 1);
        // ...
    }
    

    您可以使用任何其他角色来检索不同类型的数据。

    【讨论】:

    • 这个角色只是做我需要做的事。再次感谢!
    • 这里没有显示如何获取 QStandardItemModel
    • @mrg95,你可以通过QModelIndex::model()函数访问模型。但是,为了从索引中获取包含数据,您不需要模型本身 - QModelIndex::data() 函数可以完成工作。
    • 抓取的模型是 const 的,所以你不能,例如,删除其中的行。只能从中读取。
    • 那又怎样? OP 询问读取数据而不是修改模型。我不明白你的意思是什么,你为什么不赞成这个答案。
    【解决方案2】:

    我遇到了同样的问题,因为我需要检索我的特殊模型:

    auto myModel=const_cast<MySpecialModel*>(dynamic_cast<const MySpecialModel*>(modelIndex.model()));
    

    这对我来说是一个完美的解决方案。

    但是,这样做似乎有一个重要的问题:

    上面写着:

    会返回一个指向模型的 const 指针,因为调用模型的非 const 函数可能会使模型索引无效并可能使您的应用程序崩溃。

    不幸的是,文档没有说明为什么可能会发生崩溃以及不应该做什么。

    【讨论】:

      【解决方案3】:

      只要施放它:

      QStandardItemModel *model { static_cast<QStandardItemModel *>(model()); }
      

      【讨论】:

      • 不工作。 error: static_cast from 'const QAbstractItemModel *' to 'QStandardItemModel *' casts away qualifiers
      • 只需在演员表中添加一个const,然后。没有意识到 model() 返回了一个指向 const 的指针。
      猜你喜欢
      • 1970-01-01
      • 2021-11-10
      • 2011-06-04
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多