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<GMResource>)
来包裹QSharedPointer<GMResource>
输入QVariant
【讨论】:
以上是关于QModelIndex::数据不工作的主要内容,如果未能解决你的问题,请参考以下文章
无法为“QModelIndex”获取“QWidget* 编辑器”
在 Qt 中如何对 QModelIndex 的直接子索引进行排序