Qt QDataWidgetMapper与自定义qvariant对象

时间:2018-05-15 19:08:43

标签: qt model-view-controller qabstractitemmodel

我正在尝试导航Qt MVC框架,目前我的代码正常运行,QStandardItemModel包含表示项目和表示项目字段的行。

然而,QStandardItemModel中的内容的基础数据是一个对象列表,并且必须将该对象列表转换为行和列似乎是不必要的。

理想情况下,我可以将对象存储在QStandardItemModel中,而不必担心列。我从QAbstractTableModel retrieve custom object on data changed看到这可以使用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),那么这个映射将如何工作呢?

0 个答案:

没有答案