我正在尝试导航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),那么这个映射将如何工作呢?