gpt4 book ai didi

Qt 在模型使用 internalpointer() 时重新实现 QSortFilterProxyModel::data()

转载 作者:行者123 更新时间:2023-12-02 02:07:07 28 4
gpt4 key购买 nike

我有一个使用 internalpointer() 实现他的 data() 的书面模型 (myModel)。我想使用 QSortFilterProxyModel 过滤一棵树(基于 myModel),

我让它工作了,只有当我尝试从树中获取任何数据时我的应用程序崩溃了。

我认为这是因为在调用树数据时,期望得到 myModel indexModel,但我得到了 myQSortFilterProxyModel indexModel。

myItem *myModel::getItem(const QModelIndex &index) const
{
if (index.isValid()) {
myItem *item = static_cast<myItem*>(index.internalPointer());
if (item) return item;
}
return rootItem;
}

myModel data() 使用 internalPointer()

QVariant myModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();

if (role != Qt::DisplayRole && role != Qt::EditRole)
return QVariant();

myItem *item = getItem(index);

return item->data(index.column());
}

在 myModel 和树之间设置过滤器模型

void myTree::myInit()
{
...
myModel *model = new myModel();
proxyModel = new mySortFilterProxyModel(this);
proxyModel->setSourceModel(model);
this->setModel(proxyModel);
...

myTree 是 QTreeView 的子类。我想使用 tree->model() 来获取 myModel 模型

如何获取源模型数据?

最佳答案

由于您指出的原因,这种方法不适用于代理模型。Internalpointer/id 只能在保证获得属于模型本身的索引传递的方法中访问,如 data() 等。

获取索引项的更好方法是通过自定义角色传递它:

 enum Roles {
MyItemRole=Qt::UserRole
};

QVariant data( const QModelIndex& index, int role ) const {
...
if ( role == MyItemRole )
return QVariant::fromValue<MyItem>( item );
//MyItem or MyItem*, depending on whether it can be copied/has
// value semantics or not
...
}

在使用代码时:

 const MyItem item = index.data( MyModel::MyItemRole ).value<MyItem>();

您需要在 header 中 Q_DECLARE_METATYPE(MyItem)(或 MyItem*)并在运行时调用 qRegisterMetaType(),以便 MyItem/MyItem* 可以作为 QVariant 传递。

这种方法的优点是无论中间有任何代理模型,它都可以工作,并且调用数据的代码甚至不需要知道代理。

关于Qt 在模型使用 internalpointer() 时重新实现 QSortFilterProxyModel::data(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14422267/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com