QML / C ++ Master / Detail ComboBox / Listview

时间:2016-07-19 02:48:11

标签: qml qtquick2 master-detail qtquickcontrols2

在Qt 5.7,Quick Controls 2.0上,我有一个带有从属ListView的主ComboBox。当用户更改ComboBox选择时,从站如何更改?

例如:

想象一下,我有一份人员名单,每个人都有车辆清单:

  • Person1 - car1,car2,car3
  • Person2 - car4
  • Person3 - car5,car6,car7,car8
  • Person4 - car9,car10 ...

这些人必须出现在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;
}

1 个答案:

答案 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