Хранение пользовательских объектов в QStandardItemModel

Я хотел бы хранить пользовательские объекты (скажем, экземпляры MyDataClass) в древовидной структуре, связанной с представлением. Поэтому я использовал QStandardItemModel. Я думаю, что MyDataClass должен наследовать от QStandardItem:

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

Но я не могу понять, как хранить экземпляры этого класса в QStandardItemModel,
Я старался QStandardItem.setChild а потом appendRow но это не работает, и я думаю, что на самом деле не понимаю, что такое QStandardItemModel.
Я думаю, что решение имеет дело с QStandardItem.setData но я не могу понять, как это работает для пользовательских объектов.

0

Решение

Я наконец заставил это работать, используя 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

Спасибо за помощь.

2

Другие решения

Ты можешь использовать QStandardItemModel::setItemPrototype,
http://qt-project.org/doc/qt-4.8/qstandarditemmodel.html#setItemPrototype

  1. Унаследовать от QStandardItem и переопределить метод clone,
  2. Создайте новый экземпляр вашего предмета и передайте его setItemPrototype,
1

По вопросам рекламы [email protected]