Я хотел бы хранить пользовательские объекты (скажем, экземпляры 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
clone
,setItemPrototype
,