QModelIndex::数据不工作

Posted

技术标签:

【中文标题】QModelIndex::数据不工作【英文标题】:QModelIndex::data not working 【发布时间】:2013-12-15 19:35:43 【问题描述】:

我的应用程序中有一个带有数据模型的 QTreeView。当使用以下插槽双击项目时,我正在捕获:

void MainWindow::on_treeView_doubleClicked(const QModelIndex &index)

    if (index.parent().isValid()) 
        QSharedPointer<GMResource> resource;

       resource = index.data(Qt::UserRole).value<QSharedPointer<GMResource> >();
        Workspace::GetSingleton()->OpenResourceEditor(resource);
    

我希望 QModelIndex::data() 方法(执行并)返回该索引引用的项目的底层 QStandardItem::data(),但它不返回任何内容。我在 QStandardItem::data() 方法中设置了一个断点,它甚至没有被调用,所以我可能错误地假设了 QModelIndex::data() 实际返回的内容。

如何访问QModelIndex引用的项目数据(例如访问我添加到模型中的原始QStandardItem)。

这是我的data() 派生类的data() 方法:

virtual QVariant data( int role) const 
     if (role==Qt::UserRole) 
            return QVariant(resource);
     
        return QStandardItem::data(role);

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

我找到了问题的解决方案。

我替换了这段代码:

return QVariant(resource);

使用此代码:

 QVariant r;
 r.setValue<QSharedPointer<GMResource> >(resource);
 return r;

似乎按预期工作。我猜 data() 方法正在执行,但由于某种原因没有触发断点。

【讨论】:

不确定,但我猜树线相当于QVariant::fromValue(resource);。这不等于QVariant(resource) 的问题是没有模板化的构造函数,所以它会被转换成别的东西(但我不知道是什么),这将导致不同的类型。 fromValue是模板化的(虽然可以推导出来),所以获取类型并存储在QVariant中。【参考方案2】:

你应该添加Q_DECLARE_METATYPE(QSharedPointer&lt;GMResource&gt;) 来包裹QSharedPointer&lt;GMResource&gt; 输入QVariant

【讨论】:

以上是关于QModelIndex::数据不工作的主要内容,如果未能解决你的问题,请参考以下文章

无法为“QModelIndex”获取“QWidget* 编辑器”

如何将 QModelIndex 设置为 QListView

在 Qt 中如何对 QModelIndex 的直接子索引进行排序

QTableView::edit( const QModelIndex &index ) 失败

QModelIndex 与 QStandardItem互转

QModelIndex 与 QStandardItem互转