Bootstrap

[Qt] 使用MouseArea 是需要注意的点

前言

多个MouseArea存在重叠区域时,使用  propagateComposedEvents 进行事件的传递分配,这些在 Qt 的帮助文档里都有,这里不赘述。

这里需要说一下当 MouseArea 和 包含鼠标事件的组件一起使用会出现的问题:

问题一:组件的鼠标事件全部失效

问题二:解决了问题一以后,MouseArea的drag拖拽功能失效

编程建议:

当MouseArea 和 有鼠标事件的组件一起使用时,请把包含组件的 Item  和 MouseArea 分离,且把 MouseArea 写到 Item 的前面,然后通过 id  的方式让 MouseArea 填充 Item。这样既保证了 Item 内部组件都能够正常响应鼠标事件以完成自有的响应功能,也能保证MouseArea的 drag 拖拽功能能工作。

正确Demo:

main.qml

Item{

    MouseArea{
        id:ma
        anchors.fill:demoqml
        drag.target:demoqml
    }

    DemoItem.qml{
        id:demoqml
    }
}

DemoItem.qml

Item{
    

    Button{
        //...
    }

    ComboBox{
        //...
    }
}

几种异常Demo的写法:

可拖动,无法响应组件事件:

main.qml

Item{
    
    DemoItem{
        id:demoitem

        MouseArea{
            id:ma
            anchors.fill:parent
            drag.target:demoitem
        }
    }
}

不可拖动,组件有响应:

main.qml

Item{

    MouseArea{
        
        drag.target:demoitem

        DemoItem{
            id:demoitem
            anchors.fill:parent
        }
    }
}

注意:

同一层级,越靠底部的组件越先创建,先创建的会被后创建的覆盖,越在底层,可以理解为z值越低(其实z值是一致的,只是被后创建的组件盖上了)。

;