2012-11-05 9 views
6

Ho un ListView QML, dove il delegato è reale C++ collegato al componente del dispositivo, utilizzando thread e QWidgets.Come disabilitare la gestione dinamica degli oggetti quando gli elementi visibili in qml listview cambiano?

Ma quando si scorre il ListView o si espande il delegato nella finestra del programma, i delegati non visibili vengono distrutti.

Cosa posso fare per salvare i delegati nel mio ListModel?

mio codice di esempio:

import Qt 4.7 

    Rectangle { 
    width: 320; height: 200; color: "white" 
    Text { 
     id: debugText 
     font.pixelSize: 24 
     color:"blue" 
     text: "count of created delegates: " + added.toString() 
    } 
    property int added: 0 
    Component { 
     id: delegate 
     Item { 
      id: wrapper 
      Component.onCompleted: added += 1 
      width: 180; height: 50 
      Column { 
       x: 5; y: 5 
       Text { text: '<b>Name:</b> ' + name } 
       Text { text: '<b>Number:</b> ' + number } 
      } 
     } 
    } 
    ListView { 
     width: parent.width; height: parent.height 
     model: contactModel 
     delegate: delegate 
    } 

    ListModel { 
     id: contactModel 
     ListElement { 
      name: "Bill Smith" 
      number: "555 3264" 
     } 
     ListElement { 
      name: "John Brown" 
      number: "555 8426" 
     } 
     ListElement { 
      name: "Sam Wise" 
      number: "555 0473" 
     } 
     ListElement { 
      name: "Bill Smith" 
      number: "555 3264" 

     } 
     ListElement { 
      name: "John Brown" 
      number: "555 8426" 
     } 
     ListElement { 
      name: "Sam Wise" 
      number: "555 0473" 
     } 
    } 
} 

Grazie! Risolvo il problema! Primo modo: creo oggetti sfuggenti, colonne e ripetitori e questa soluzione mi soddisfa. Secondo modo: per più griglie nella vista principale (programma simile a SCADA) utilizzo QObjectList, dove ogni oggetto è QObjectList, dove ogni oggetto è il mio DataObject :)

risposta

5

Ciò che si può fare per impedire a ListView di distruggere i delegati è per assegnare un valore elevato alla proprietà cacheBuffer di ListView (http://doc-snapshot.qt-project.org/4.8/qml-listview.html#cacheBuffer-prop). Questo è ovviamente un trucco e non un approccio raccomandato. Memorizzare qualsiasi stato in un delegato è una cattiva idea.

Quello che dovresti fare invece è gestire gli oggetti nativi separatamente in un modello C++ in cui puoi controllare la durata di ogni oggetto come desideri.

+0

Proprietà cacheBuffer: int – ctinka

Problemi correlati