2016-12-30 4 views
0

Мне было интересно, есть ли способ для ListView вести себя как настольный контроль и не реагировать на перетаскивание мышью?Как сделать QML ListView непрозрачным?

Я знаю об объекте interactive, но я все еще хочу, чтобы ListView реагировал на клики, колесико мыши, клавиши со стрелками и имел ScrollBar.

ответ

2

Для начала установка interactive на false в значительной степени обездвиживает вид.

Недвижимость keyNavigationEnabled не работает, на данный момент (this critical bug).

Так нужно будет сделать небольшую дополнительную работу, чтобы заставить его работать, как вы хотите:

MouseArea { 
    anchors.fill: ll 
    onWheel: ll.flick(0, wheel.angleDelta.y * 5) 
    } 
    ListView { 
    id: ll 
    model: 50 
    width: 50 
    height: 200 
    spacing: 5 
    focus: true 
    interactive: false 
    boundsBehavior: Flickable.StopAtBounds 
    Keys.onPressed: { 
     if (event.key === Qt.Key_Up) flick(0, 500) 
     else if (event.key === Qt.Key_Down) flick(0, -500) 
    } 
    delegate: Rectangle { 
     width: 50 
     height: 50 
     color: "red" 
     MouseArea { 
     anchors.fill: parent 
     onClicked: console.log("clicked") 
     } 
    } 
    } 

Интерактивность отключен, клавиша навигации осуществляется вручную, а фон MouseArea используется для захвата события колеса. Обратите внимание, что вам не нужно делать ничего особенного, чтобы включить щелчок по элементам для неинтерактивного представления, он работает независимо от того, интерактивен или нет.

+0

Спасибо, это почти меня там. Единственное, что щелкнуть по делегату, не работает, и «щелчок» никогда не появляется в консоли. У меня Qt 5.8.0 RC. –

+1

@AlexJenter - на самом деле проблема заключалась в том, что область захвата колесика охватывала делегатов, если вы поместили ее за просмотр списка, она работает так, как ожидалось. См. Редактирование ответа. – dtech

+0

Это работает, спасибо. Найден другой способ решить эту проблему: установите для свойства propateComposedEvents области мыши, захватившей колесо, значение «true». Это поможет избежать перемещения его на верхний уровень и ссылки на отдельный компонент. –