在QStandardItemModel中存储自定义对象

Storing custom objects in QStandardItemModel

本文关键字:自定义 对象 存储 QStandardItemModel      更新时间:2023-10-16

我想在树结构中存储自定义对象(假设是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