MouseArea-QML元素';s鼠标事件

MouseArea-QML元素';s鼠标事件,qml,mouseevent,mousearea,Qml,Mouseevent,Mousearea,如果在QML元素上放置MouseArea,则MouseArea将窃取所有鼠标事件。 因此,TextEdit将不可编辑且不可选择 TextEdit { // some properties MouseArea { // some properties onClicked: { /* do something */ } } } 有办法解决吗 顺便说一下,如果我把一个大的MouseArea放在另一个MouseArea上,较大的MouseArea

如果在QML元素上放置
MouseArea
,则
MouseArea
将窃取所有鼠标事件。 因此,
TextEdit
将不可编辑且不可选择

TextEdit {
    // some properties
    MouseArea {
        // some properties
        onClicked: { /* do something */ }
    }
}
有办法解决吗


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

您可以针对您的特定情况尝试以下方法:

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

   TextEdit 
   {
      /* Do whatever  */       
   }
}
请注意,我已按顺序排列了这些。所有子项的z值都将高于父项。对于父级,在树中后面出现的同级具有更高的z值

总体思路如下:

  • 定义所有鼠标区域
  • 在z值上排列它们
  • 阅读z属性,您将能够理解如何安排鼠标区域

    例如:


    在本例中,我通过自己分配z值来覆盖自然顺序。

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


    有关更多信息和示例,请参阅
    MouseArea
    的文档和属性
    propagateComposedEvents

    您必须启用
    MouseArea
    将组合事件(如
    单击的
    释放的
    )传播到下面的组件,如@Torgeirl的回答所述

    如果希望您的
    文本编辑
    滑块
    复选框
    接收此类事件,只需将其
    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;
        }
    }
    

    我使用Qt4。我不能用它。那不是我想要的。在第一个示例中,mouseEvent不会发出,因为
    TextEdit
    高于
    mouseArea
    。我想要
    text编辑
    accept mouseEvent并同时选择。我想找到一种方法来模拟Qt4中Qt5的
    propagateComposedEvents
    功能。当我遇到这个问题时,我正在寻找其他解决方案,我想我应该指出,对于某些信号处理程序,设置
    mouse.accepted=false
    没有效果(搜索
    MouseArea
    docs以查找
    对查找所有文件没有任何作用。
    如果我想持续更新mouseX和mouseY,此解决方案不起作用。更改上面示例代码中的文本编辑以显示鼠标X、Y位置,只要按住鼠标按钮,您就会看到它停止更新。设置onPressed中的“mouse.accepted=false”会导致MouseArea属性在释放按钮之前不会更新。不确定这是否是一个错误?这一问题由BaCaRoZzo和szotsaki方法解决,非常感谢
    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;
        }
    }
    
                    //消息框
                    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
                                }
                            }
                       }
                    }