MouseArea窃取了QML元素的鼠标事件

时间:2013-04-24 04:32:47

标签: qml

如果我在QML元素上放置MouseArea,那么MouseArea将窃取所有鼠标事件。 因此,TextEdit将是不可编辑且无法选择的。

TextEdit {
    // some properties
    MouseArea {
        // some properties
        OnClicked: { /* do something */ }
    }
}

有没有办法解决它?

顺便说一下,如果我将MouseArea放在另一个MouseArea上,则较大的MouseArea会窃取所有鼠标事件。我该如何解决?我认为手动传递鼠标事件可以解决这个问题,但是怎么做呢?

4 个答案:

答案 0 :(得分:20)

您必须启用MouseArea将组合事件(如clickedreleased)传播到下方组件,如@ Torgeirl的回答所述。

如果您希望TextEditSliderCheckBox收到此类事件,只需将accepted属性设置为{{1}即可通过该事件。 }。

示例代码:

false

答案 1 :(得分:5)

propagateComposedEvents属性允许MouseArea通过clicked()之类的鼠标事件。 您必须在事件处理程序中设置event.accepted = false

请参阅MouseArea的文档和属性propagateComposedEvents以获取更多信息和示例。

答案 2 :(得分:0)

你可以针对你的具体情况尝试这样的事情:

Rectangle
{
   MouseArea 
   {
      id: mouseAreaTop
      anchors.fill: parent 
      OnClicked: { /* do something */ }
   }

   TextEdit 
   {
      /* Do whatever  */       
   }
}

请注意,我已将这些内容安排在订单中。所有孩子的z都比父母高。后来在树中为父母出现的兄弟姐妹具有更高的z值。

一般的想法是这样的:

  1. 定义所有鼠标区域
  2. 将它们排列在z值上
  3. 了解z属性here in the Qt documentation,您将能够了解如何安排鼠标区域。

    例如:

    Parent
    {
        anchors.fill: parent
        child1
        {
            anchors.fill: parent
            z: 2
        }
    
        child2
        {
            anchors.fill: parent
            z: 1
        }
    
        child3
        {
            anchors.fill: parent
            z: 4
        }
    
        child4
        {
            anchors.fill: parent
            z: 3
        }
    }
    

    在这个例子中,我通过自己分配z值来覆盖自然排序。

答案 3 :(得分:-2)

                //消息框
                Rectangle {
                    id:msgRectangle
                    width: Math.min(messageText.implicitWidth +14, listView.width -98)
                    height: messageText.implicitHeight + 16
                    color:  send ? "#9dea6a" : "#eeeeee"
                    radius: 3
                    TextEdit {
                        id: messageText
                        text: content
                        wrapMode: TextEdit.Wrap
                        enabled: true
                        readOnly: true
                        selectByKeyboard: true
                        selectByMouse: true
                        selectedTextColor: "white"
                        persistentSelection:true
                        selectionColor: "#3396FF"

                    }
                    MouseArea{
                        id:text_area
                        width: parent.width
                        height: parent.height
                        acceptedButtons: Qt.LeftButton|Qt.RightButton
                        propagateComposedEvents: true
                        onClicked: {
                            if(mouse.button===Qt.LeftButton){
                                mouse.accepted = false;
                            } else {
                                mouse.accepted = true;
                            }

                        }
                        onPressed: {
                            if(mouse.button===Qt.LeftButton){
                                mouse.accepted = false;
                            } else {
                                mouse.accepted = true
                            }
                        }
                        onReleased:{
                            if(mouse.button===Qt.LeftButton){
                                mouse.accepted = false;
                            } else {
                                mouse.accepted = true
                            }
                        }
                        onDoubleClicked:{
                            if(mouse.button===Qt.LeftButton){
                                mouse.accepted = false;
                            } else {
                                mouse.accepted = true
                            }
                        }
                        onPositionChanged:{
                            if(mouse.button===Qt.LeftButton){
                                mouse.accepted = false;
                            } else {
                               mouse.accepted = true
                            }
                        }
                        onPressAndHold:{
                            if(mouse.button===Qt.LeftButton){
                                mouse.accepted = false;
                            } else {
                                mouse.accepted = true
                            }
                        }
                   }
                }