2017-07-12 2 views
0

Mon ListView n'affiche pas les nouvelles entrées dans mon modèle lorsqu'elles sont ajoutées.ListView ne s'actualise pas lorsque le modèle de tableau de chaînes change

Lorsqu'une boîte de dialogue s'ouvre, je copie une QStringList d'un élément C++ dans une propriété Qml. L'utilisateur modifie ensuite le tableau à l'aide des contrôles fournis (ajouter, modifier, supprimer).

Malheureusement, le ListView ne se met pas à jour lorsque je modifie la propriété. La propriété est modifiée correctement (comme vu par la sortie de débogage).

Comment puis-je mettre à jour ListView automatiquement en utilisant la liaison de données?

import QtQuick 2.7 
import QtQuick.Controls 2.0 
import QtQuick.Layouts 1.3 

ApplicationWindow { 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 

    property var things 

    Component.onCompleted: things = [] // normally retrieved from C++ QStringList 

    ColumnLayout { 
     anchors.fill: parent 

     RowLayout { 
      Layout.fillWidth: true 

      TextField { 
       Layout.fillWidth: true 
       id: theTextField 
      } 

      Button { 
       Layout.fillWidth: true 
       text: qsTr("Append") 
       onPressed: { 
        things.push(theTextField.text) 
        console.log(things) 
       } 
      } 

      Button { 
       Layout.fillWidth: true 
       text: qsTr("Remove") 
       onPressed: { 
        var index = things.indexOf(theTextField.text) 
        if(index == -1) 
         console.warn('Not found!') 
        else 
         things.splice(index, 1) 
        console.log(things) 
       } 
      } 

      Button { 
       Layout.fillWidth: true 
       text: qsTr("Clear"); 
       onPressed: { 
        things = []; 
        console.log(things) 
       } 
      } 
     } 

     ListView { 
      id: listView 

      Layout.fillWidth: true 
      Layout.fillHeight: true 
      model: things 
      delegate: Label { 
       text: modelData 
      } 
     } 
    } 
} 

Répondre

0

La raison en est qu'il n'y a pas thingsChanged -signal lors de l'utilisation d'une fonction pour modifier la things. La référence stockée dans things restera la même, peu importe ce que vous faites.

Pour les modèles de données tels que ListModel, il en est de même, mais il existe special signals dont beaucoup sont utilisés pour indiquer à une vue, qu'il devrait mettre à jour son contenu.

Si vous avez désespérément besoin d'utiliser des tableaux, vous devez appeler manuellement le thingsChanged(), chaque fois que vous avez modifié quelque chose au contenu des tableaux. Mais comme cela indique seulement que tout le tableau a changé, l'une des principales forces d'un View est nulle - la possibilité de changer uniquement ce qui a été changé.

Lorsqu'un View réagit à un signal thingsChanged, il détruit tous les délégués en cours, puis les recréera à nouveau, peu importe si quelque chose sera différent.

Si vous utilisez un ListModel ou un QAbstractItemModel, le View peut insérer des instances uniques de nouveaux délégués, les supprimer ou les modifier.

0

Remplacez le tableau par un véritable ListModel. Utilisez la fonction append!

Button { 
      Layout.fillWidth: true 
      text: qsTr("Clear"); 
      onPressed: { 
       model.append({"data": theTextField.text}) 
      } 
     } 

et au et du bloc principal ListModel {id: modèle}