2017-10-20 32 views
0

J'ai un modèle qui fonctionne bien avec QTreeView. Dans le modèle que je mis en œuvre une sorte qui ressemble à ceci:Est-ce que QML TreeView prend en charge le signal layoutChanged émis par le modèle?

void SimpleTreeModel::sort(Node* sortedNode) 
{ 
    emit layoutAboutToBeChanged(QList<QPersistentModelIndex>(), VerticalSortHint); 
    QModelIndexList oldIndices = persistentIndexList(); 

    Node::SortType sortType = Node::Down; 

    //sort starting node 
    sortedNode->sortChildren(sortType); 

    QModelIndexList newIndices; 
    newIndices.reserve(oldIndices.size()); 
    for(const auto &i : oldIndices) 
    { 
     Node* node = const_cast<Node*>(nodeFromIndex(i)); 
     QModelIndex index = indexFromNode(node); 
     newIndices.push_back(index); 
    } 
    changePersistentIndexList(oldIndices, newIndices); 

    QModelIndex startingIndex = indexFromNode(sortedNode); 
    emit layoutChanged({ QPersistentModelIndex(startingIndex) }, VerticalSortHint); 
} 

quand j'appelle cette fonction, QTreeView met à jour la vue, mais TreeView en QML ne font pas cela. QML utilisation TreeView:

TreeView 
{ 
    model: treeModel 
    TableViewColumn 
    { 
     title: "Title" 
     role: "title" 
     width: 700 
    } 
} 

Qu'est-ce que je fais mal? Pourquoi la vue ne met pas à jour la disposition des éléments après le tri?

Répondre

0

Je pense que vous devez déléguer l'élément de l'arborescence. Les données sont fournies à déléguer.

Essayez de changer QML TreeView comme indiqué ci-dessous en ajoutant itemDelegate

TreeView 
{ 
    model: treeModel 

    itemDelegate: Item { 
     Text { 
       color: styleData.textColor 
       text: styleData.value 
      } 
    } 

    TableViewColumn 
    { 
     title: "Title" 
     role: "title" 
     width: 700 
    } 
} 

Regardez en lien ci-dessous pour comprendre l'importance du délégué, entre le modèle et la vue QML. Il y a une image qui explique facilement.

http://doc.qt.io/qt-5/qtquick-modelviewsdata-modelview.html

délégué - dicte comment les données doivent apparaître dans la vue. Le délégué prend chaque donnée dans le modèle et l'encapsule. Les données sont accessibles via le délégué.

+0

Merci pour la réponse. Mais je ne peux pas comprendre comment cela devrait aider. Le problème est que TreeView ne répond pas aux signaux du modèle. Après avoir lu le code source de TreeView, je n'y ai pas trouvé les fonctions responsables de répondre au signal layoutChanged du modèle. Cela m'a troublé. –

+0

@ strelok.ndv regardez dans ce lien, vous verrez une image et comment délégué est nécessaire pour communiquer entre la vue QML et le modèle .. http://doc.qt.io/qt-5/qtquick-modelviewsdata-modelview.html – Naidu

+0

Mis à jour la réponse aussi .. – Naidu