2016-06-06 1 views
0

Я использую QML ScrollView и ListView. ListView состоит из headerDelegate и delegate:QML ListView сосредоточиться на первом элементе, кроме заголовка делегата

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 
    } 
} 

Everytime ListView прокручивается к вершине первого mainDelegate показан вместо headerDelegate который остается скрытым. Как заставить свиток правильно показать headerDelegate?

+0

Я не понимаю, в чем проблема. –

+0

Когда появляется ListView, я вижу первый элемент, а не данные заголовка. Для просмотра данных заголовка мне нужно прокручивать вниз и вверх, после этой манипуляции я могу видеть данные заголовка –

+0

Вы должны предоставить полностью рабочий код, а не только фрагменты. Также подумайте о том, чтобы избежать установки размеров, если вы 'anchor.fill' элемент. Использование базового 'Прямоугольника' вместо ваших делегатов приводит к правильному рабочему коду. – BaCaRoZzo

ответ

0

Проблема здесь состоит в том, что ScrollView ожидает ребенка contentY равным 0 но ListView позиционирует первый пункт модели на contentY = 0 и помещает элемент заголовка перед ним. Если ListView.header - 50px высокий, то он находится на ListView.contentY = -50.

Решение, которое сработало для меня, должно было излучать сигнал ListView.contentYChanged(). Он вызывает обновление ScrollView. Дайте мне знать, если это решит вашу проблему.

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

Нет, это не сработает. После загрузки ListView у меня есть Y-позиция «0», а Header теперь отображается только после прокрутки, позиция Y изменена на -400 (возможно высота заголовка) –

+1

Я изменил listView. contentY вручную После окончательной загрузки заголовка (я получил событие) я установил listView.contentY = 0 - headerDelegateView.height, и он работает. @Filip Hazubski благодарит вас за хороший способ решения! –

+0

примерный код 'Rectangle' { ID: headerDelegateView WebEngineView { ... onLoadingChanged: { если (loadRequest.status === WebEngineView.LoadSucceededStatus) { ... // здесь я вычисляю страницы высоту веб с помощью Java Script и установите headerDelegateView.height listView.contentY = 0 - headerDelegateView.height } ScrollView { ... ListView { ID: ListView ... }} }» –

1

Я изменил listView.contentY вручную. После окончательного загрузки заголовка (я получил событие) я установил listView.contentY = 0 - headerDelegateView.height, и он работает. @Filip Hazubski благодарит вас за хороший способ решения!

пример кода

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 
    ... 
    } 
} 
}