前言
多个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值是一致的,只是被后创建的组件盖上了)。