如何处理重叠 Mousareas 中的按下和释放信号?
Posted
技术标签:
【中文标题】如何处理重叠 Mousareas 中的按下和释放信号?【英文标题】:How to handle pressed and released signals in overlapping Mousareas? 【发布时间】:2016-02-15 08:42:23 【问题描述】:我想在两个重叠的鼠标区域中处理按下和释放的信号。
我的情况简要说明如下:
我有两个鼠标区域 M1 和 M2。 M1 包含在一个矩形中,用作一个按钮。它具有固定的尺寸,例如 100x100。 M2填满了整个屏幕,尺寸肯定比M1大。我可以任意设置 M1 和 M2 的 z 属性。我需要处理这两个鼠标区域中的按下和释放信号。
在 QtQuick 中是否可以?如果可以,如何实现?
import QtQuick 2.5
Item
visible: true
width:1280
height:720
Rectangle
color: "blue"
width: 100; height: 100
z:1
MouseArea
id:m1
anchors.fill: parent
onPressed :
mouse.accepted = false
console.log("pressed m1")
onReleased:
console.log("released m1")
MouseArea
id: m2
anchors.fill: parent
onPressed :
console.log("pressed m2")
onReleased:
console.log("released m2")
我想在按下和释放 m1 时同时按下和释放鼠标区域。
(Qt 5.5 版)
【问题讨论】:
为什么不显示您尝试过的任何东西? 听起来很像这个问题:***.com/questions/35312255/…。这是关于触摸区域的,但应该适用相同的解决方案。 对 eventfilters 的引用非常有帮助,它朝着正确的方向发展,非常适合我的实际用例! 【参考方案1】:在第一个答案中的 cmets 之后。这是怎么回事:
import QtQuick 2.5
import QtQuick.Window 2.2
Window
visible: true
width:1280
height:720
Rectangle
color: "blue"
width: 100; height: 100
z:1
MouseArea
id:m1
anchors.fill: parent
propagateComposedEvents: true
onPressed :
mouse.accepted = false
console.log("pressed m1")
onReleased:
console.log("released m1")
MouseArea
id: m2
anchors.fill: parent
onPressed :
console.log("pressed m2")
onReleased:
console.log("released m2")
m1.released(mouse);
这会打印出您想要的内容。
【讨论】:
@OnurA 但是当鼠标在m1外按下并释放时,它显示pressed m2, released m2, released m1
。不应该只是pressed m2, released m2
吗?
是的,你是对的。实际上,这种方法或多或少地回答了我的问题,但我不会在我的应用程序中使用它。所以我需要更大的鼠标区域用于整个屏幕的用户输入。但是,我通过删除 m2 并使用事件过滤器 onQQuickView Item 解决了我的问题。所以如果有人提出这个作为答案,我肯定会接受它作为正确答案!【参考方案2】:
首先,id
s 不能以大写字母开头,所以你的MouseArea
s 不能是M1
和M2
。相反,它们必须是 m1 和 m2。
import QtQuick 2.3
Rectangle
id: root
width: 400
height: 300
Rectangle
id: m1Container
width: 100
height: 100
color: "blue"
z: 1
MouseArea
id: m1
anchors.fill: parent
hoverEnabled: true
onPressed:
mouse.accepted = false
console.log("m1 pressed")
onReleased:
console.log("m1 released")
MouseArea
id: m2
anchors.fill: parent
onPressed:
console.log("m2 pressed")
onReleased:
console.log("m2 released")
if(m1.containsMouse)
m1.released(mouse)
编辑:我从 sk2212 的答案中借用了m1.released(mouse)
的想法,并稍作调整以处理鼠标在m1
之外并被按下和释放的情况。
【讨论】:
因为我想保持简单,所以我没有进一步详细说明。显然我需要。试试这段代码,告诉我你是否被这些鼠标区域的机器人按下和释放:) 你试过我的吗?如果不先尝试。 我想同时处理按下和释放的事件。因此,您的代码所做的是,如果您单击 m1,则只会按下并释放 m1。我想要得到的是 m1 按下,m1 释放,m2 按下,m2 释放 当 m1 被按下/释放时,你想同时按下和释放 m1 和 m2 吗? 是的,当 m1 被按下/释放时,你应该让 m1 被按下 m2 被按下,m1 被释放 m2 被释放。顺序对我来说并不重要以上是关于如何处理重叠 Mousareas 中的按下和释放信号?的主要内容,如果未能解决你的问题,请参考以下文章