Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.4.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Drawer qui laisse filer les événements souris

Bonjour,

je m'essaie enfin vraiment au QML (grâce au peu que j'ai pu faire au boulot) et je fais une pseudo application pour tester un peu tous les controls dispo.
Donc j'ai mon application ApplicationWindow qui a comme contenu une StackView qui contient une Page contenant juste une ListView.
J'ai mis un bouton dans le header pour afficher un Drawer sur le côté droit qui contient lui aussi une ListView.

Mon problème : si la liste dans mon Drawer ne contient pas assez d'élément pour qu'elle puisse scroller, alors la liste principale (celle dans la StackView) vole l'événement et donc mon application est soft-locked. Même en relâchant la souris, la faire bouger fait bouger la mauvaise liste (et cliquer sur le bouton pour fermer le Drawer ne fonctionne pas). Et je dois cliquer sur une autre application pour "réparer" le bug.

Voici le code entier :
import QtQuick 2.9
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.3

ApplicationWindow {
id: window
visible: true
width: 540
height: 960
title: "Karaoke Mugen"

StackView {
id: stack
initialItem: mainPage
anchors.fill: parent
}

Page {
id: mainPage

header: ToolBar {
id: toolBar

RowLayout {
spacing: 20
anchors.fill: parent

ToolButton {
icon.name: "drawer"
onClicked: leftDrawer.open()
}

Label {
id: titleLabel
text: "Liste de lecture courante"
font.pixelSize: 20
elide: Label.ElideRight
horizontalAlignment: Qt.AlignHCenter
verticalAlignment: Qt.AlignVCenter
Layout.fillWidth: true
}

ToolButton {
icon.name: "menu"
onClicked: optionsMenu.open()

Menu {
id: optionsMenu
x: parent.width - width
transformOrigin: Menu.TopRight

MenuItem {
text: "Settings"
onTriggered: stack.push("qrc:/AboutPage.qml")
}
MenuItem {
text: "About"
//onTriggered: aboutDialog.open()
}
}
}
}
}

ListView {
id: listView
anchors.fill: parent

ScrollIndicator.vertical: ScrollIndicator {}

model: ListModel {
ListElement { title: "Dragon Ball Z - OP1" } // à copier/coller plein de fois pour avoir un scroll
}

property SwipeDelegate opened: null
delegate: SwipeDelegate {
id: delegate
width: parent.width
height: 65

contentItem: Item {
RowLayout {
anchors.fill: parent
spacing: 10

Button {
id: btn
icon.name: "drawer"

anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter

height: parent.height

background: Rectangle {
color: "white"
}
}

Text {
Layout.fillWidth: true
text: title
elide: Qt.ElideRight
font.pixelSize: 40
height: parent.height
anchors.verticalCenter: parent.verticalCenter
}
}
}

swipe.right: Button {
anchors.right: parent.right
anchors.top: parent.top
anchors.bottom: parent.bottom

background: Rectangle {
color: "red"
}

contentItem: Text {
text: "DELETE"
font.pixelSize: 50
verticalAlignment: Qt.AlignVCenter
horizontalAlignment: Qt.AlignHCenter
anchors.fill: parent
}

onClicked: delegate.swipe.close()
}
swipe.onCompleted: {
listView.opened = this
}

onPressed: {
if (listView.opened != null)
{
listView.opened.swipe.close()
listView.opened = null
}
}
}
}
}

Drawer {
id: leftDrawer
dragMargin: 0
width: window.width * 0.8
height: window.height
edge: Qt.LeftEdge

Page {
anchors.fill: parent
header: ToolBar {
Material.foreground: "white"

RowLayout {
spacing: 20
anchors.fill: parent

ToolButton {
icon.name: "back"
onClicked: leftDrawer.close()
anchors.right: parent.right
}

Text {
text: "Playlists"
font.pixelSize: 20
color: "white"

horizontalAlignment: Qt.AlignHCenter
verticalAlignment: Qt.AlignVCenter
Layout.fillWidth: true
}
}
}

ListView {
anchors.fill: parent

ScrollIndicator.vertical: ScrollIndicator {}

model: ListModel {
ListElement { name: "Test" } // en rajouter 2/3
}

delegate: ItemDelegate {
text: name
font.pixelSize: 30
padding: 10
width: parent.width
}
}
}
}
}
Merci d'avance.

Réponses

Connectez-vous ou Inscrivez-vous pour répondre.