1

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

举个例子:

想象一下,我有一个人员列表,每个人都有一个汽车列表:

  • 人 1 - 车 1、车 2、车 3
  • 人 2 - 车 4
  • Person3 - car5、car6、car7、car8
  • Person4 - car9, car10 ...

人必须出现在 ComboBox 上,当用户选择一个人时,列表视图必须显示人的汽车。

我已经尝试过了,但是从不调用数据成员的 carsRole,因此 ListView 不显示任何内容。

质量管理体系:

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;
}
4

1 回答 1

0

如果将角色枚举暴露给 QML,则可以调用,从 Qt 5.5 开始QAbstractItemModel::data()标记为: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"):

然后import foo.bar 1.0在 QML 中。

于 2016-07-19T06:26:12.987 回答