Qt QDataWidgetMapper с пользовательским объектом qvariant - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь перемещаться по инфраструктуре 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)?

...