16

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

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

有没有办法解决它?

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

4

4 回答 4

28

如@Torgeirl 的回答所述,您必须启用将MouseArea组合事件传播clicked到下面的组件。released

如果您希望您的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;
    }
}
于 2015-04-21T07:27:48.073 回答
5

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

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

于 2013-04-25T18:49:26.080 回答
2

您可以针对您的特定情况尝试这样的事情:

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

   TextEdit 
   {
      /* Do whatever  */       
   }
}

请注意,我已按顺序排列了这些内容。所有子级的 z 都高于父级。在树中较晚出现的兄弟姐妹具有更高的 z 值。

总体思路是这样的:

  1. 定义所有鼠标区域
  2. 将它们排列在 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 值来覆盖自然排序。

于 2013-04-24T13:06:45.313 回答
0
                //消息框
                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
                            }
                        }
                   }
                }
于 2018-09-08T19:21:22.460 回答