2012-04-03 8 views
1

Ich habe ein Problem und ich kann keine Lösung finden, ich hoffe, Sie finden es hier: Ich habe ein ListView mit seinem Modell und seinem Delegaten und so weiter, so gemacht :Erhalte Daten von TextEdit in einer QML ListView

Item { 
id: creation; width: parent.width ; height: parent.height 
..... 
ListView { 
     id: mainViewLiist 
     model: CreationModel {id: modelCreation} 
     delegate: delegateCreation 
     width: parent.width; height: parent.height; x: -(screen.width * 1.5); 
     cacheBuffer: 100; 
    } 
} 

der Delegat enthält Text, TextEdit, etc .... so etwas wie diese:

Component { 
id: creationDelegate 
Item { 
    id: itemCreate 
    .... 
    Row { 
       id: rowSerie 
       spacing: 5 
       Text { 
        id: seriesLabel 
        text: "Series:" 
        .... 
       } 

       TextEdit { 
        id: seriesTextEdit 
        text: "" 
        .... 
        } 
      } 
    .... 
    } 
.... 
} 

Innerhalb des gleichen Artikels "Schöpfung", gibt es auch eine Symbolleiste mit zwei Tasten, etwas wie folgt:

ToolBar { id: toolBarCreation; height: 40; 
    width: parent.width; 
    opacity: 1.0 
    button1Label: "Back" 
    button2Label: "Create" 
    onButton1Clicked: 
    { 
     ... 
    } 
    onButton2Clicked: 
    { 
     ... 
    } 
    } 

Was ich will ist das: wenn ich auf die zweite Schaltfläche "Create" klicke, möchte ich einfach mit console.log (arg1, ...) zeigen, was im TextEdit "seriesTextEdit" jedes Elements geschrieben wird in der Listenansicht. Zum Beispiel, wenn meine Listenansicht 10 Elemente enthält und der Benutzer einen Wert in das gesamte TexTedit des Elements einfügt, wie kann ich dann auf diese Daten zugreifen? Vielen Dank, Giammarco

Antwort

6

Die ListView könnte die falsche Klasse zu verwenden sein, da es Elemente zerstört, die nicht im sichtbaren Bereich sind und neue erstellt, die sichtbar werden. Wenn Sie das nicht möchten, verwenden Sie einen Repeater.

In jedem Fall können Sie mit ListView.contentItem.children auf die untergeordneten Elemente der ListView zugreifen. Ich habe es versucht und es enthielt ein zusätzliches Element (vielleicht den Header).

Ich würde vorschlagen, eine Alias-Eigenschaft für den TextEdit-Text (seriesName in meinem Beispiel) im Stammverzeichnis Ihres Listenelementdelegaten zu haben. Wahrscheinlich brauchen Sie das gleiche für den Index, denn wie gesagt, das ListView enthält möglicherweise keine Elemente für alle Ihre Modellelemente. Dann können Sie eine Schleife verwenden, um die Texte zu erhalten.

print(mainViewLiist.contentItem.children.length); 
for (var i = 0, l = mainViewLiist.contentItem.children.length; i < l; i++) { 
    var child = mainViewLiist.contentItem.children[i]; 
    print(i, ": ", child, "=", child.text); 
} 
+0

Großartig, Sie waren sehr hilfreich, hauptsächlich, weil ich die Repeater-Klasse nicht kannte, jetzt verwende ich Repeater. Gibt es einen ListView: PositionViewAtIndex für den Repeater? Ich kann es nicht finden. Im PhotoViewer-Beispiel verwenden sie übrigens keinen Repeater, sondern ListView und Elemente werden nicht zerstört, auch wenn sie nicht sichtbar sind. HMow können sie das tun? Nochmals vielen Dank für Ihre Hilfe – Giammarco

+0

@Giammarco Wenn Sie blakharaz Antwort richtig gefunden haben, bitte akzeptieren Sie seine Antwort zuerst;) – anticafe