2016-07-19 28 views
1

Auf Qt 5.7, Quick Controls 2.0, habe ich eine Master-ComboBox mit einem Slave-ListView. Wie kann sich der Slave ändern, wenn der Benutzer die ComboBox-Auswahl ändert?QML/C++ Master/Detail ComboBox/Listview

Für exemple:

Stellen Sie sich vor, dass ich eine Liste von Personen haben, und jede Person hat eine Liste von Autos:

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

Die Personen müssen auf der ComboBox angezeigt werden, und wenn der Benutzer eine Person auswählt, muss die Listview die Autos der Person anzeigen.

Ich habe das versucht, aber die CarsRole wird nie Daten Mitglied aufgerufen, so dass die ListView nichts zeigt.

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

Antwort

0

Wenn Sie die Rollen Enum QML aussetzen, können Sie QAbstractItemModel::data() nennen, die als Q_INVOKABLE seit Qt 5.5 markiert ist:

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) 
} 

Wenn PersonsModel bereits als QML Typ registriert und die Instanz in QML erstellen, wird dies bereits arbeiten. Wenn personsModel eine Kontexteigenschaft ist, werden Sie PersonsModel auf QML registrieren, zum Beispiel:

qmlRegisterUncreatableType("foo.bar", 1, 0, "PersonsModel", "PersonsModel is a context property"): 

Und dann import foo.bar 1.0 in QML.