在QStandardItemModel中存储自定义对象

时间:2014-08-18 08:42:29

标签: c++ qt qstandarditemmodel

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

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

但我无法弄清楚如何在QStandardItemModel中存储此类的实例。 我尝试QStandardItem.setChild然后appendRow,但它不起作用,我认为我没有真正得到QStandardItemModel的东西。 我认为该解决方案可以处理QStandardItem.setData,但我无法弄清楚它如何适用于自定义对象。

2 个答案:

答案 0 :(得分:2)

我终于使用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

感谢您的帮助。

答案 1 :(得分:1)

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

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