Я пытаюсь перемещаться по инфраструктуре Qt MVC, и в настоящее время мой код работает нормально с QStandardItemModel, содержащей строки, представляющие элементы, и столбцы, представляющие поля элемента.
Однако основные данные для того, что идет в QStandardItemModelэто список объектов, и необходимость преобразовывать этот список объектов в строки и столбцы кажется ненужной.
В идеале я мог бы просто хранить свои объекты в QStandardItemModel и не беспокоиться о столбцах.Из QAbstractTableModel я извлекаю пользовательский объект для измененных данных , что это возможно при использовании Q_DECLARE_METATYPE и реализации QStyledItemDelegate.
Однако я не вижу, как это могло бы работать с QDataWidgetMapper, что ятакже использовать.Есть ли способ сделать эту работу, или я делаю это совсем неправильно?
Допустим, у меня есть класс (обратите внимание, это весь псевдокод):
class Fruit {
string name;
string color;
bool goodForYou;
}
И скажитенастоящие «данные»:
QList<Fruit> fruit;
fruit.append({"Orange", "orange", true});
fruit.append({"Apple", "red", true});
fruit.append({"Poison apple", "black", false});
Сейчас я определяю перечисление для столбцов:
enum FruitColumns {
Name = 0,
Color = 1,
GoodForYou = 2
}
Для заполнения модели:
StandardItemModel model;
for (i = 0; i < fruit.length; i++) {
Fruit f = fruit[i];
QStandardItem *item = new QStandardItem();
QModelIndex nameIndex = model.index(i, FruitColumns::Name);
QModelIndex colorIndex = model.index(i, FruitColumns::Color);
QModelIndex goodForYouIndex = model.index(i, FruitColumns::GoodForYou);
model.setData(nameIndex, f.name);
model.setData(colorIndex, f.color);
model.setData(goodForYouIndex, f.goodForYou);
}
Теперь я могу получить данные для отображения в ListView:
QListView fruitListView;
fruitListView.setModel(&model);
Когда кто-то выбирает фрукт из списка, у меня есть другой виджет, который использует QDataWidgetMapper для сопоставления каждого поля фрукта с текстовым полем дляПользователь для редактирования.
QDataWidgetMapper mapper();
mapper.setModel(model);
...
QLineEdit nameEdit();
QLineEdit colorEdit();
QCheckbox goodForYouEdit();
mapper.addMapping(nameEdit, FruitColumns::Name)
mapper.addMapping(colorEdit, FruitColumns::Color)
mapper.addMapping(goodForYouEdit, FruitColumns::GoodForYou)
...
mapper.setCurrentModelIndex(index);
Опять все работает хорошо.Но как это отображение сработало бы, если бы я хранил только один «столбец» данных, где эти данные были моим классом (зарегистрированным как QVariant)?