鼠标区域窃取了 QML 元素的鼠标事件



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

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

有办法解决吗?

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

您必须启用MouseArea来传播像clickedreleased这样的组合事件到下面的组件,正如@Torgeirl的答案所描述的。

如果您希望TextEdit, SliderCheckBox接收这些事件,只需通过将其accepted属性设置为false来传递事件。

示例代码:

RowLayout {
    TextEdit { text: "Hi" }
    Slider {}
    CheckBox { text: "CheckBox"}
    MouseArea {
        anchors.fill: parent
        propagateComposedEvents: true
        onClicked: mouse.accepted = false;
        onPressed: mouse.accepted = false;
        onReleased: mouse.accepted = false;
        onDoubleClicked: mouse.accepted = false;
        onPositionChanged: mouse.accepted = false;
        onPressAndHold: mouse.accepted = false;
    }
}

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

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

您可以根据具体情况尝试如下操作:

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

请注意,我将它们按顺序排列。所有子节点的z值都大于父节点。对于父节点,在树中较晚出现的兄弟节点具有更高的z值。

大致思路是这样的:

    定义所有的鼠标区域
  1. 按z值排列

阅读Qt文档中的z属性,你将能够理解如何安排鼠标区域。

,

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值来覆盖自然排序。

                //消息框
                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
                            }
                        }
                   }
                }

相关内容

  • 没有找到相关文章

最新更新