Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Problem with MouseArea in delegate
Forum Updated to NodeBB v4.3 + New Features

Problem with MouseArea in delegate

Scheduled Pinned Locked Moved Solved QML and Qt Quick
mousearea
14 Posts 3 Posters 7.5k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    sk2212
    wrote on last edited by
    #3

    @nnnnn

    This is also working for me:

                GridView {
                    id: grid
                    clip:true
                    anchors.fill: parent
                    cellWidth: Units.dp(80)
                    cellHeight: Units.dp(80)
                    interactive: false
    
                    delegate: Rectangle {
                        id: rect
                        width: grid.cellWidth - Units.dp(5)
                        height: grid.cellHeight - Units.dp(5)
                        color: backcolor
    
                        MouseArea {
                            hoverEnabled: true
                            anchors.fill: parent
                            onPressed: {
                                console.log("pressed")
                            }
                            onReleased: {
                                console.log("released")
                            }
                            onEntered: {
                                console.log("entered");
                            }
                        }
                 }
    
    
                    Component.onCompleted: {
                        for(var i=0;i<36;i++) {
                            grid.model.append({backcolor: "#E0E0E0"});
                        }
                    }
    
                    model: ListModel {
    
                    }
       }
    
    1 Reply Last reply
    0
    • N Offline
      N Offline
      nnnnn
      wrote on last edited by
      #4

      @p3c0

      Thanks for your answer!

      Unfortunately, this did not solve my problem. With an additional MouseArea (as parent of the GridLayout) I can capture the Released-events (form the outer MouseArea), the Pressed-event (from the inner MouseAreas), however I do not see any Entered-events anymore :-(

      p3c0P N 2 Replies Last reply
      0
      • N nnnnn

        @p3c0

        Thanks for your answer!

        Unfortunately, this did not solve my problem. With an additional MouseArea (as parent of the GridLayout) I can capture the Released-events (form the outer MouseArea), the Pressed-event (from the inner MouseAreas), however I do not see any Entered-events anymore :-(

        p3c0P Offline
        p3c0P Offline
        p3c0
        Moderators
        wrote on last edited by
        #5

        @nnnnn That's strange. Is there any other component present apart from the code that you posted earlier ?

        157

        1 Reply Last reply
        0
        • N nnnnn

          @p3c0

          Thanks for your answer!

          Unfortunately, this did not solve my problem. With an additional MouseArea (as parent of the GridLayout) I can capture the Released-events (form the outer MouseArea), the Pressed-event (from the inner MouseAreas), however I do not see any Entered-events anymore :-(

          N Offline
          N Offline
          nnnnn
          wrote on last edited by
          #6

          @sk2212

          I tried your example here - I do not get entered-Events when I move the mouse pointer around while the button is pressed; same problem as in my code.

          Once again my scenario - to avoid misunderstandings:
          Go to a cell, press the button, keep button pressed, move the pointer to other cells, release the button.
          In this case, I would like a pressed-event from the first cell, entered-events from all others, and a released-event from the last one. Seems to be tricky...

          Cheers

          1 Reply Last reply
          0
          • N Offline
            N Offline
            nnnnn
            wrote on last edited by
            #7

            @p3c0

            Hi!

            Here is a complete example (which is unfortunately not doing what I want). Anything wrong here?

            import QtQuick 2.4
            import QtQuick.Window 2.2
            import QtQuick.Layouts 1.1
            
            Window {
                visible: true
                color: "black"
            
                MouseArea {
                    id: outer
                    anchors.fill: parent
            
                    onReleased: {
                        console.log("outer - onReleased")
                    }
            
                    GridLayout {
                        id: fieldGrid
                        anchors.fill:parent
                        rows: 2
                        columns: 2
            
                        Repeater {
                            id: repeater
                            model: myModel
            
                            Rectangle {
                                id: del
                                Layout.column: col
                                Layout.row: row
                                Layout.fillWidth: true
                                Layout.fillHeight: true
            
                                Text {
                                    anchors.centerIn: parent
                                    text: name
                                }
            
                                MouseArea {
                                    id: inner
                                    anchors.fill: parent
                                    hoverEnabled: true
            
                                    onPressed: {
                                        console.log("inner - onPressed")
                                        mouse.accepted = false;
                                    }
                                    onEntered: {
                                        console.log("inner - onEntered")
                                    }
                                }
                            }
                        }
                    }
                }
            
                ListModel {
                    id: myModel
            
                    ListElement { row: 0; col: 0; name: "a"}
                    ListElement { row: 0; col: 1; name: "b"}
                    ListElement { row: 1; col: 0; name: "c"}
                    ListElement { row: 1; col: 1; name: "d"}
                }
            }
            
            
            p3c0P 1 Reply Last reply
            0
            • N nnnnn

              @p3c0

              Hi!

              Here is a complete example (which is unfortunately not doing what I want). Anything wrong here?

              import QtQuick 2.4
              import QtQuick.Window 2.2
              import QtQuick.Layouts 1.1
              
              Window {
                  visible: true
                  color: "black"
              
                  MouseArea {
                      id: outer
                      anchors.fill: parent
              
                      onReleased: {
                          console.log("outer - onReleased")
                      }
              
                      GridLayout {
                          id: fieldGrid
                          anchors.fill:parent
                          rows: 2
                          columns: 2
              
                          Repeater {
                              id: repeater
                              model: myModel
              
                              Rectangle {
                                  id: del
                                  Layout.column: col
                                  Layout.row: row
                                  Layout.fillWidth: true
                                  Layout.fillHeight: true
              
                                  Text {
                                      anchors.centerIn: parent
                                      text: name
                                  }
              
                                  MouseArea {
                                      id: inner
                                      anchors.fill: parent
                                      hoverEnabled: true
              
                                      onPressed: {
                                          console.log("inner - onPressed")
                                          mouse.accepted = false;
                                      }
                                      onEntered: {
                                          console.log("inner - onEntered")
                                      }
                                  }
                              }
                          }
                      }
                  }
              
                  ListModel {
                      id: myModel
              
                      ListElement { row: 0; col: 0; name: "a"}
                      ListElement { row: 0; col: 1; name: "b"}
                      ListElement { row: 1; col: 0; name: "c"}
                      ListElement { row: 1; col: 1; name: "d"}
                  }
              }
              
              
              p3c0P Offline
              p3c0P Offline
              p3c0
              Moderators
              wrote on last edited by
              #8

              @nnnnn This too works on my system. I'm using Qt 5.5 on Ubuntu.

              157

              N 1 Reply Last reply
              0
              • p3c0P p3c0

                @nnnnn This too works on my system. I'm using Qt 5.5 on Ubuntu.

                N Offline
                N Offline
                nnnnn
                wrote on last edited by
                #9

                Really? You get Entered-events while you keep the mouse button pressed?

                Ok, I will check with Qt 5.5 here, I wanted to update anyway. Thanks for your help, I will post how things are going...

                1 Reply Last reply
                0
                • N Offline
                  N Offline
                  nnnnn
                  wrote on last edited by
                  #10

                  Hmm, it's not working for me under Qt5.5/Kubuntu 14.04 either. No entered-Events when I move the mouse around while pressing the mouse button.

                  1 Reply Last reply
                  0
                  • S Offline
                    S Offline
                    sk2212
                    wrote on last edited by
                    #11

                    @nnnnn

                    Ah...got your point. The events are not triggered when you press a button, hold this button and move to another button. THAN the events for the "new" entered button are not triggered.

                    I did not know a solution so far...

                    1 Reply Last reply
                    0
                    • N Offline
                      N Offline
                      nnnnn
                      wrote on last edited by
                      #12

                      I really find no solution for this using MouseArea. My only hope now is that I can find a workaround using a MultiPointTouchArea, but maybe this is something completely different (have to check to documentation first...)

                      1 Reply Last reply
                      0
                      • N Offline
                        N Offline
                        nnnnn
                        wrote on last edited by
                        #13

                        I have a simple solution now, using only one MouseArea on top and looking for onPositionChanged. I don't think it is very beautifuly (I have to call childAt() all the time), but at least it is working.

                        import QtQuick 2.4
                        import QtQuick.Window 2.2
                        import QtQuick.Layouts 1.1
                        
                        Window {
                            visible: true
                            color: "black"
                        
                            GridLayout {
                                id: fieldGrid
                                anchors.fill: parent
                                rows: 2
                                columns: 2
                        
                                Repeater {
                                    id: repeater
                                    model: myModel
                        
                                    Rectangle {
                                        id: del
                                        Layout.column: col
                                        Layout.row: row
                                        Layout.fillWidth: true
                                        Layout.fillHeight: true
                        
                                        Text {
                                            anchors.centerIn: parent
                                            text: name
                                        }
                                    }
                                }
                            }
                        
                            MouseArea {
                                anchors.fill: parent
                                property point pos: Qt.point(-1, -1)
                        
                                onPressed: {
                                    var obj = fieldGrid.childAt(mouse.x, mouse.y)
                                    if ( !obj )
                                        return;
                        
                                    console.log("onPressed")
                                    pos = Qt.point(obj.Layout.row, obj.Layout.column)
                                    console.log("newField: " +  pos)
                                }
                                onReleased: {
                                    console.log("onReleased")
                                }
                        
                                onPositionChanged: {
                                    var obj = fieldGrid.childAt(mouse.x, mouse.y)
                                    if ( !obj )
                                        return;
                        
                                    var newPos = Qt.point(obj.Layout.row, obj.Layout.column)
                                    if ( newPos === pos )
                                        return;
                        
                                    console.log("newField: " +  newPos)
                                    pos = newPos;
                                }
                            }
                        
                            ListModel {
                                id: myModel
                        
                                ListElement {row: 0; col: 0; name: "a" }
                                ListElement {row: 0; col: 1; name: "b" }
                                ListElement {row: 1; col: 0; name: "c" }
                                ListElement {row: 1; col: 1; name: "d" }
                            }
                        }
                        
                        
                        p3c0P 1 Reply Last reply
                        0
                        • N nnnnn

                          I have a simple solution now, using only one MouseArea on top and looking for onPositionChanged. I don't think it is very beautifuly (I have to call childAt() all the time), but at least it is working.

                          import QtQuick 2.4
                          import QtQuick.Window 2.2
                          import QtQuick.Layouts 1.1
                          
                          Window {
                              visible: true
                              color: "black"
                          
                              GridLayout {
                                  id: fieldGrid
                                  anchors.fill: parent
                                  rows: 2
                                  columns: 2
                          
                                  Repeater {
                                      id: repeater
                                      model: myModel
                          
                                      Rectangle {
                                          id: del
                                          Layout.column: col
                                          Layout.row: row
                                          Layout.fillWidth: true
                                          Layout.fillHeight: true
                          
                                          Text {
                                              anchors.centerIn: parent
                                              text: name
                                          }
                                      }
                                  }
                              }
                          
                              MouseArea {
                                  anchors.fill: parent
                                  property point pos: Qt.point(-1, -1)
                          
                                  onPressed: {
                                      var obj = fieldGrid.childAt(mouse.x, mouse.y)
                                      if ( !obj )
                                          return;
                          
                                      console.log("onPressed")
                                      pos = Qt.point(obj.Layout.row, obj.Layout.column)
                                      console.log("newField: " +  pos)
                                  }
                                  onReleased: {
                                      console.log("onReleased")
                                  }
                          
                                  onPositionChanged: {
                                      var obj = fieldGrid.childAt(mouse.x, mouse.y)
                                      if ( !obj )
                                          return;
                          
                                      var newPos = Qt.point(obj.Layout.row, obj.Layout.column)
                                      if ( newPos === pos )
                                          return;
                          
                                      console.log("newField: " +  newPos)
                                      pos = newPos;
                                  }
                              }
                          
                              ListModel {
                                  id: myModel
                          
                                  ListElement {row: 0; col: 0; name: "a" }
                                  ListElement {row: 0; col: 1; name: "b" }
                                  ListElement {row: 1; col: 0; name: "c" }
                                  ListElement {row: 1; col: 1; name: "d" }
                              }
                          }
                          
                          
                          p3c0P Offline
                          p3c0P Offline
                          p3c0
                          Moderators
                          wrote on last edited by
                          #14

                          @nnnnn Hmm. I overlooked your onEntered requirement. It doesnot work in my example. The problem is that once you set mouse.accepted=false the release event is not trapped.

                          157

                          1 Reply Last reply
                          0

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved