C++ 更改ItemData的内容

C++ 更改ItemData的内容,c++,qt,C++,Qt,我将自定义数据类型的对象存储在QStandardListItems中。我通过调用以下命令恢复这些对象: i.data(Qt::UserRole + 1).value<LiteReach>(); i.data(Qt::UserRole+1).value(); 这只会在堆栈中创建一个新对象。我对他们所做的任何改变都是暂时的 是否有一种方法可以获取存储在itemData中的基本对象,以便直接对其进行操作? 如果不是,更改itemData的首选方法是什么 我不希望每次修改对象时都调用se

我将自定义数据类型的对象存储在QStandardListItems中。我通过调用以下命令恢复这些对象:

i.data(Qt::UserRole + 1).value<LiteReach>();
i.data(Qt::UserRole+1).value();
这只会在堆栈中创建一个新对象。我对他们所做的任何改变都是暂时的

是否有一种方法可以获取存储在itemData中的基本对象,以便直接对其进行操作? 如果不是,更改itemData的首选方法是什么


我不希望每次修改对象时都调用setData,因为它会消耗大量资源。

您可以使用允许访问具体数据对象的指针,而不是将整个数据复制到上述QVariant中

问题是
value()
返回数据的副本。所以,如果您进行了任何修改,那么一旦从堆栈中删除了副本,它们就会消失


如果您不想使用指针,我想您必须坚持使用
setData()

我的印象是QVariant类不是用于指针存储的

然而,如果你真的想这样做,你可以做一些类似的事情

LiteNode* myPtr = new LiteNode;
QVariant v(reinterpret_cast<quint32>(myPtr)); //or quint64 for 64-bit apps
myPtr = reinterpret_cast<LiteNode*>(v.value<quint32>());
LiteNode*myPtr=新的LiteNode;
QV变体(重新解释铸造(myPtr))//或64位应用程序的quint64
myPtr=重新解释(v.value());

这样,您甚至不必将对象类型声明为Qt元类型

如何将(LiteNode*)类型设置为元类型?我尝试了Q_DECLARE_元类型(LiteNode*),但似乎不起作用。您可能忘记了在该类的标头中包含。Q_DECLARE_元类型(LiteNode*)起作用。谢谢我选择从QStandardItem派生我的类,这样整个问题就不会再次出现。如果您这样做,我建议使用
quintptr
而不是
quint32
。因为如果将64位系统上的指针存储在32位整数中,它们会被严重弄乱咬是我没有选择这种方法的原因之一。虽然这在当时似乎是一个限制(我来自MFC),但我认为继承模型比使用itemData优雅得多。@Gayan,基本上,QT item data可以是一个对象,并且可以有多个插槽。我个人更喜欢使用itemData,而不是继承的模型。