[英]Storing custom objects in QStandardItemModel
I'd like to store custom objects (let's say instances of MyDataClass) in a tree structure, and linked with a view. 我想将自定义对象(例如MyDataClass的实例)存储在树形结构中,并与视图链接。 So I used QStandardItemModel. 所以我用了QStandardItemModel。 I think that MyDataClass should inherit from QStandardItem : 我认为MyDataClass应该继承QStandardItem:
class MyDataClass : public QStandardItem
{
public:
MyDataClass(QString name)
private:
vector<float> someData;
}
But I cannot figure out how to store instances of this class in a QStandardItemModel
. 但是我不知道如何在QStandardItemModel
存储此类的实例。 I tried QStandardItem.setChild
and then appendRow
but it does not work and I think I don't really get the QStandardItemModel thing. 我尝试了QStandardItem.setChild
,然后appendRow
但它不起作用,我想我并没有真正了解QStandardItemModel。 I think that the solution deals woth QStandardItem.setData
but I cannot figure out how it works for custom objects. 我认为该解决方案可以解决QStandardItem.setData
但我无法弄清楚它如何用于自定义对象。
I have finally make it work using QVariant
. 我终于可以使用QVariant
使其工作了。 To fill the model with custom data : 用自定义数据填充模型:
MyDataClass *data;
... // adding some data
QVariant variant;
variant.setValue(data);
QStandardItemModel model; // here is your model
QStandardItem *parentItem = model.invisibleRootItem();
QStandardItem *item = new QStandardItem();
item->setData(variant);
parentItem->setChild(0, 0, item); // adding the item to the root
Later, when you want to retrieve your data : 稍后,当您要检索数据时:
MyDataClass *retrievedData = model.invisibleRootItem()->
child(0, 0)->data().value<MyDataClass*>();
Note that I had to add a line in the class declaration : 请注意,我必须在类声明中添加一行:
class MyDataClass : public QStandardItem
{
public:
MyDataClass(QString name)
private:
vector<float> someData;
}
Q_DECLARE_METATYPE(MyDataClass *) // add this line
Thank you for your help. 谢谢您的帮助。
You can use QStandardItemModel::setItemPrototype
. 您可以使用QStandardItemModel::setItemPrototype
。
http://qt-project.org/doc/qt-4.8/qstandarditemmodel.html#setItemPrototype http://qt-project.org/doc/qt-4.8/qstandarditemmodel.html#setItemPrototype
clone
. 继承自QStandardItem和重新实现方法clone
。 setItemPrototype
. 创建您的项目的新实例,并将其传递给setItemPrototype
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.