C++ 为什么QPersistentModelIndex不能存储在QStandardItemModel';什么东西? 背景
在我的模型中,我必须在一个项目的数据中保留对另一个项目的引用 文件说明:C++ 为什么QPersistentModelIndex不能存储在QStandardItemModel';什么东西? 背景,c++,qt,qt5,qstandarditemmodel,C++,Qt,Qt5,Qstandarditemmodel,在我的模型中,我必须在一个项目的数据中保留对另一个项目的引用 文件说明: QPersistentModelIndex是一个模型索引,可由应用程序存储,稍后用于访问模型中的信息 接受QVariant作为一个值,该值可以是,因此我可以编写如下内容: ... auto *model = new QStandardItemModel(); auto *referencedItem = new QStandardItem("Test"); auto *item = new QStand
QPersistentModelIndex
是一个模型索引,可由应用程序存储,稍后用于访问模型中的信息
接受QVariant
作为一个值,该值可以是,因此我可以编写如下内容:
...
auto *model = new QStandardItemModel();
auto *referencedItem = new QStandardItem("Test");
auto *item = new QStandardItem();
model->appendRow(referencedItem);
item->setData(QPersistentModelIndex(referencedItem->index()), Qt::UserRole);
// the next line prints "Test"
qDebug() << item->data(Qt::UserRole).toPersistentModelIndex().data().toString();
...
是错误的,为什么不应该这样做?我猜这与删除行和尝试更新正在删除的行中的内容有关。好的,但这会如何影响存储在数据中的持久索引?毕竟,它可能是任何
QVariant
。这有什么关系呢?区别在于,普通的QVariants没有一种特殊的更新机制,这种机制在内部与Qt处理模型行删除的方式相联系。每个QPersistentModelIndex的内存地址都必须在某处维护,并在行删除过程中调用以更新其行号。因此,如果在意外的时间将其删除,可能会导致崩溃。再说一次,我只是在猜测。评论完全有可能已经过时了。检查来源。@PatrickParker,我已尝试在模型中移动项目并从模型中删除项目。它还没有崩溃,索引已经正确更新。所以,我正在进一步寻找一个可能的原因。您是否尝试同时删除包含自引用持久模型索引的多行范围?如果这样做有效的话,我也会被难倒。我还没有深入了解源代码。我猜这与删除行以及尝试更新那些被删除行中的内容有关。好的,但这会如何影响存储在数据中的持久索引?毕竟,它可能是任何QVariant
。这有什么关系呢?区别在于,普通的QVariants没有一种特殊的更新机制,这种机制在内部与Qt处理模型行删除的方式相联系。每个QPersistentModelIndex的内存地址都必须在某处维护,并在行删除过程中调用以更新其行号。因此,如果在意外的时间将其删除,可能会导致崩溃。再说一次,我只是在猜测。评论完全有可能已经过时了。检查来源。@PatrickParker,我已尝试在模型中移动项目并从模型中删除项目。它还没有崩溃,索引已经正确更新。所以,我正在进一步寻找一个可能的原因。您是否尝试同时删除包含自引用持久模型索引的多行范围?如果这样做有效的话,我也会被难倒。我还没有深入了解来源。
item->setData(QPersistentModelIndex(referencedItem->index()), Qt::UserRole);