[Interest] Need "best practice" recommendation on MouseArea

Helbrass helbrass at gmail.com
Fri May 11 20:47:10 CEST 2012


Hi All!

Impressed with QML power I've been experimenting with some ideas I have
that I would not dare to do with any other toolkit, and got some
behavioural problems with MouseArea that I cannot resolve in a clean way.
I can do it with some boolean flags and setting them with some complicated
logic, but it feels like I missed something important and there is obvious
and clean way to solve it.

So, there is an application with auto-hidden toolbar, it appears when
mouse is in the top part of application and disappear when mouse leaves
it. But when mouse enters MouseArea inside the button - MouseArea in the
toolbar triggers onExited() and toolbar disappears with all buttons.

In case if mailing list will block the attachment or you'd like to see
code in the body of email:

========================== main.qml ====================================
import QtQuick 1.1

Rectangle {
         id: topComponent
         width: 600
         height: 600
         state: "Invisible"

         Rectangle {
             id: mainAreaRectangle
             color: "grey"
             anchors.fill: parent
             anchors.margins: 15

             Text {
                 text: "some kind of working area"
             }

         }

         MouseArea {
             hoverEnabled: true
             anchors.top: parent.top
             height: 15
             width: parent.width
             onClicked: console.debug("top mouse area clicked")
             onEntered: {
                 if (topComponent.state != "Visible")
                     topComponent.state = "Visible";
             }
         }

         Rectangle {
             id: visibleBar
             width: parent.width
             anchors.top: parent.top
             height: 30
             color: "#708090"

             MouseArea {
                 anchors.fill: parent
                 hoverEnabled: true
                 onExited: {
                     console.debug("exited toolbar");
                     if (topComponent.state != "Invisible") {
                         topComponent.state = "Invisible"
                     }
                 }
                 onEntered: console.debug("entered toolbar")
                 onClicked: console.debug("clicked toolbar")
             }

             Row {
                 anchors.fill: parent

                 Rectangle {
                     id: button
                     color: "blue"
                     radius: 4
                     height: 24
                     width: 24
                     anchors.verticalCenter: parent.verticalCenter

                     MouseArea {
                         anchors.fill: parent
                         hoverEnabled: true
                         onExited: console.debug("exited button")
                         onEntered: console.debug("entered button")
                         onClicked: console.debug("clicked button")
                     }

                 }

             }

         }
         states: [
             State {
                 name: "Invisible"
                 PropertyChanges {
                     target: visibleBar
                     opacity: 0
                     z: -1
                 }
             },
             State {
                 name: "Visible"
                 PropertyChanges {
                     target: visibleBar
                     opacity: 0.9
                     z: 1
                 }
             }
         ]

         transitions: [
             Transition {
                 from: "Visible"
                 to: "Invisible"
                 SequentialAnimation {
                     NumberAnimation {
                         properties: "opacity"
                         duration: 400
                     }
                     NumberAnimation {
                         properties: "z"
                         from: 1
                         to: -1
                     }
                 }
             },
             Transition {
                 from: "Invisible"
                 to: "Visible"
                 SequentialAnimation {
                     NumberAnimation {
                         properties: "z"
                         from: -1
                         to: 1
                     }
                     NumberAnimation {
                         properties: "opacity"
                         duration: 400
                     }
                 }
             }
         ]
}

==============================================================================

-- 
Using Opera's revolutionary email client: http://www.opera.com/mail/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: main.qml
Type: application/octet-stream
Size: 3041 bytes
Desc: not available
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20120511/85c42db5/attachment.obj>


More information about the Interest mailing list