繁体   English   中英

在QStandardItemModel中存储自定义对象

[英]Storing custom objects in QStandardItemModel

我想将自定义对象(例如MyDataClass的实例)存储在树形结构中,并与视图链接。 所以我用了QStandardItemModel。 我认为MyDataClass应该继承QStandardItem:

class MyDataClass : public QStandardItem
{
public:
    MyDataClass(QString name)
private:
    vector<float> someData;
}

但是我不知道如何在QStandardItemModel存储此类的实例。 我尝试了QStandardItem.setChild ,然后appendRow但它不起作用,我想我并没有真正了解QStandardItemModel。 我认为该解决方案可以解决QStandardItem.setData但我无法弄清楚它如何用于自定义对象。

我终于可以使用QVariant使其工作了。 用自定义数据填充模型:

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

稍后,当您要检索数据时:

MyDataClass *retrievedData = model.invisibleRootItem()->
                                     child(0, 0)->data().value<MyDataClass*>();

请注意,我必须在类声明中添加一行:

class MyDataClass : public QStandardItem
{
public:
    MyDataClass(QString name)
private:
    vector<float> someData;
}

Q_DECLARE_METATYPE(MyDataClass *) // add this line

谢谢您的帮助。

您可以使用QStandardItemModel::setItemPrototype
http://qt-project.org/doc/qt-4.8/qstandarditemmodel.html#setItemPrototype

  1. 继承自QStandardItem和重新实现方法clone
  2. 创建您的项目的新实例,并将其传递给setItemPrototype

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM