2016-06-06 12 views
0

Ich verwende QML ScrollView und ListView. ListView besteht aus headerDelegate und delegate:QML ListView Fokus auf das erste Element außer Header Delegat

ScrollView { 
    id: scrollView 
    Layout.fillWidth: true 
    Layout.fillHeight: true 
    width: parent.width 
    height: parent.height 
    ListView{ 
     id: listView 
     width: parent.width 
     height: parent.height 
     spacing: 10 
     header: headerDelegate 
     anchors.fill: parent 
     property bool isFolded: false 
     model: MyModel 
     delegate: mainDelegate 
    } 
} 

Jedesmal ListView nach oben gescrollt wird der erste mainDelegate statt headerDelegate gezeigt, die verborgen bleibt. Wie kann ich erzwingen, dass die Bildlauffunktion headerDelegate korrekt anzeigt?

+0

Ich verstehe nicht, was das Problem ist. –

+0

Wenn ListView angezeigt wird, kann ich das erste Element und keine Headerdaten sehen. Zum Anzeigen der Kopfdaten muss ich nach unten und oben scrollen, nach dieser Manipulation kann ich Kopfdaten sehen –

+0

Sie sollten voll funktionsfähigen Code, nicht nur Stücke zur Verfügung stellen. Berücksichtigen Sie auch, dass Sie keine Größen festlegen müssen, wenn Sie ein Element "verankern". Die Verwendung von 'Rectangle' anstelle von Delegierten führt zu einem korrekt funktionierenden Code. – BaCaRoZzo

Antwort

0

Das Problem hier ist, dass ScrollView Kind, bevor es contentY, um gleich 0 aber ListView Positionen das erste Element des Modells bei contentY = 0 und platziert Kopf Element erwartet. Wenn ListView.header50px hoch ist, wird es unter ListView.contentY = -50 positioniert.

Die Lösung, die für mich arbeitete, war ListView.contentYChanged() Signal zu emittieren. Es verursacht ScrollView zu aktualisieren. Lassen Sie mich wissen, ob dies Ihr Problem löst.

ScrollView { 
    id: scrollView 
    Layout.fillWidth: true 
    Layout.fillHeight: true 
    width: parent.width 
    height: parent.height 
    ListView{ 
     id: listView 
     width: parent.width 
     height: parent.height 
     spacing: 10 
     header: headerDelegate 
     anchors.fill: parent 
     property bool isFolded: false 
     model: listModel 
     delegate: mainDelegate 
     onContentYChanged: console.log(contentY) 
     Component.onCompleted: { 
      contentYChanged() 
     } 
    } 
} 
+0

Nein, es funktioniert nicht. Nach dem Laden von ListView habe ich Y-Position "0" und Header wird jetzt nur nach dem Scrollen angezeigt, Y-Position wird geändert, um -400 (möglicherweise Kopfhöhe) –

+1

Ich habe ListView geändert. contentY manuell Nachdem ich den Header geladen habe (ich habe ein Event), habe ich listView.contentY = 0 - headerDelegateView.height gesetzt und es funktioniert. @Filip Hazubski danke für einen guten Lösungsweg! –

+0

Beispielcode 'Rectangle' { ID: headerDelegateView WebEngineView { ... onLoadingChanged: { if (loadRequest.status === WebEngineView.LoadSucceededStatus) { ... // hier berechne ich Web-Seite Höhe von Java Script und auf headerDelegateView.height listView.contentY = 0 - headerDelegateView.height } Scroll { ... Listview { id: listview ... } } }‘ –

1

Ich habe listView.contentY manuell geändert. Nach dem Laden des Headers (ich habe ein Event) habe ich listView.contentY = 0 - headerDelegateView.height gesetzt und es funktioniert. @Filip Hazubski danke für die gute Lösung!

Beispielcode

Rectangle 
{ 
id: headerDelegateView 
WebEngineView{ 
... 
onLoadingChanged: { 
if (loadRequest.status === WebEngineView.LoadSucceededStatus) { 
... // here I calculate web page height by java script and set to headerDelegateView.height 
listView.contentY = 0 - headerDelegateView.height 
} 
ScrollView { 
... 
ListView{ 
    id: listView 
    ... 
    } 
} 
} 
Verwandte Themen