在Qt 5.7,Quick Controls 2.0上,我有一个带有从属ListView的主ComboBox。当用户更改ComboBox选择时,从站如何更改?
例如:
想象一下,我有一份人员名单,每个人都有车辆清单:
这些人必须出现在ComboBox上,当用户选择一个人时,Listview必须显示人的车。
我已经尝试过了,但是从未调用过carsRole数据成员,因此ListView没有显示任何内容。
QML:
ComboBox {
textRole: "name"
model: personsModel
}
ListView {
model: personsModel.cars
}
C ++
enum PersonsRoles {
nameRole = Qt::UserRole + 1,
carsRole
};
QVariant PersonsModel::data(const QModelIndex &index, int role) const
{
int row = index.row();
if ((row < 0) || (row >= _persons.size())) {
return QVariant();
}
switch (role) {
case nameRole:
return _persons.at(row);
case carsRole: {
return QVariant::fromValue(new CarsModel(row));
}
}
return QVariant();
}
QHash<int, QByteArray> PersonsModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[nameRole] = "name";
roles[carsRole] = "cars";
return roles;
}
答案 0 :(得分:0)
如果您将角色枚举公开给QML,您可以拨打QAbstractItemModel::data()
,自Qt 5.5起标记为Q_INVOKABLE
:
C ++:
enum PersonsRoles {
nameRole = Qt::UserRole + 1,
carsRole
};
Q_ENUM(PersonsRoles)
QML:
ComboBox {
id: comboBox
textRole: "name"
model: personsModel
}
ListView {
model: personsModel.data(personsModel.index(comboBox.currentIndex, 0), PersonsModel.carsRole)
}
如果PersonsModel
已经注册为QML类型并且您在QML中创建了实例,那么这已经可以了。如果personsModel
是上下文属性,则必须将PersonsModel
注册到QML,例如:
qmlRegisterUncreatableType("foo.bar", 1, 0, "PersonsModel", "PersonsModel is a context property"):
然后在QML中import foo.bar 1.0
。