如何处理重叠 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】:

首先,ids 不能以大写字母开头,所以你的MouseAreas 不能是M1M2。相反,它们必须是 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 中的按下和释放信号?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理域模型的按需数据获取

如何处理bash脚本的waitkey功能中的长按按钮?

TouchGFX:如何处理按下/未按下按钮的指令

如何用Arduino检测长按按键的按下和弹起,包括去抖动

如何处理Swift 4中的按钮重叠?

C#中怎样设置Button控件的按下和弹起事件