QML---鼠标事件与鼠标事件穿透

这篇具有很好参考价值的文章主要介绍了QML---鼠标事件与鼠标事件穿透。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

QML中MouseArea作为一个界面常用的类型,经常会出现鼠标区域重合的问题,这个时候会触发鼠标事件的只有最上层(可以设置Item的z属性来控制item的z序,而在其下层的鼠标事件则不会触发,但是往往开发者所想的是两个都触发,这个时候就需要鼠标事件穿透了。但是在先穿透之前,需要了解点东西,如下面的例子:

Item{
        anchors.fill: parent
        MouseArea{
            anchors.fill: parent
            onClicked: {
                console.log("onClicked")
            }
            onDoubleClicked: {
                console.log("onDoubleClicked")
            }
            onPressed: {
                console.log("onPressed")
            }

            onReleased: {
                console.log("onReleased")
            }

            onPressAndHold: {
                console.log("onClicked")
            }
        }
    }

上述代码将几个鼠标事件一起定义,运行程序点击一下会打印如下信息:

qml: onPressed
qml: onReleased
qml: onClicked

 会发现打印了pressed released 和clicked的信息,这个时候会让人产生误解:

a.这三个鼠标事件是单独存在单独产生的

b.pressed和released一起构成了clicked

这个时候我们进行鼠标穿透进行检验,鼠标穿透的示例如下

MouseArea{
            anchors.fill: parent
            propagateComposedEvents: true
            onClicked: {
                console.log("onClicked")
                mouse.accepted = false
            }
}

在设置MouseArea的propagateComposedEvents:属性为true,之后再在想要穿透的事件里设置mouse.accepted = false,这样就能穿透了

这时我们来检验一下之前的问题,看如下代码

Item{
        anchors.fill: parent
        z:5
        MouseArea{
            anchors.fill: parent
            propagateComposedEvents: true
            onClicked: {
                console.log("onClicked")
                mouse.accepted = false
            }
            onDoubleClicked: {
                console.log("onDoubleClicked")
            }
            onPressed: {
                console.log("onPressed")
            }

            onReleased: {
                console.log("onReleased")
            }

        }
    }
    Item{
        anchors.fill: parent
        z:3
        MouseArea{
            anchors.fill: parent
            onClicked: {
                console.log("onClicked222")
            }
            onDoubleClicked: {
                console.log("onDoubleClicked222")
            }
            onPressed: {
                console.log("onPressed222")
            }

            onReleased: {
                console.log("onReleased222")
            }
        }
    }

让两个MouseArea进行重合 然后让上层的clicked进行穿透,结果打印如下

qml: onPressed
qml: onReleased
qml: onClicked
qml: onClicked222

这个证明鼠标点击事件是单独存在的,那我们再修改代码如下 

import QtQuick 2.15
import QtQuick.Controls 1.4
import QtQuick.Window 2.15

Window {
    id:id_root
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Item{
        anchors.fill: parent
        z:5
        MouseArea{
            anchors.fill: parent
            propagateComposedEvents: true
            onClicked: {
                console.log("onClicked")
//                mouse.accepted = false
            }
            onDoubleClicked: {
                console.log("onDoubleClicked")
            }
            onPressed: {
                console.log("onPressed")
                mouse.accepted = false
            }

            onReleased: {
                console.log("onReleased")
                mouse.accepted = false
            }

        }
    }
    Item{
        anchors.fill: parent
        z:3
        MouseArea{
            anchors.fill: parent
            onClicked: {
                console.log("onClicked222")
            }
            onDoubleClicked: {
                console.log("onDoubleClicked222")
            }
            onPressed: {
                console.log("onPressed222")
            }

            onReleased: {
                console.log("onReleased222")
            }
        }
    }
}

这样修改只穿透pressed和released 不穿透clicked,运行点击,打印结果如下

qml: onPressed
qml: onPressed222
qml: onReleased222
qml: onClicked222

这就很有意思了,上层的clicked 事件和released事件没有被触发,而下层的clicked事件和released被触发了,按理来说我们没有穿透clicked事件 下层clicked事件并会不执行,而且上层的released事件也神奇的消失了。

根据这个现象我将鼠标事件做了一个整理:

1.鼠标穿透本质是将鼠标传递下去,并且其内部保存的触发的对象的指针也会发生改变,因为released是要在pressed的基础上进行实现的,因为pressed的事件传递下去了,所以上层触发了pressed,传递到最下层时released,这个released就会被判定是在最下层发生的released所以上层的released就不会触发

2.鼠标事件的clicked是由pressed和released组成,当在这个item上同时触发了这两个事件,就会产生clicked事件,所以当同时穿透pressed 、released时,虽然没有穿透clicked但是最下层收到了pressed和releassed,所以最下层会产生clicked,同时上层因为收不到released所以上层不会触发clicked文章来源地址https://www.toymoban.com/news/detail-491875.html

到了这里,关于QML---鼠标事件与鼠标事件穿透的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PyQt5下界面设计, 无边框加阴影界面, 鼠标左键移动事件

            本人小白, 网罗各个网页与资源学习总结的内容, 设置界面无边框且留有阴影, 且鼠标左键可以拖动界面的方法.         首先我们寻找一个模板进行学习演示, 例如腾讯会议的界面:         本人会仿照这个界面进行演示说明, 包括各种样式(你看到就是赚到)      

    2023年04月09日
    浏览(33)
  • 如何实现让最上面的图层不影响下面图层的点击事件(可穿透图层的鼠标事件)

    咱先来解决问题然后再了解是怎摸个原理在了解他的兼容性 pointer-events  直译为 指针事件 ,该属性指定在什么情况下某个DOM可以成为鼠标事件的 target。 简而言之,就是允许/禁止DOM的 鼠标事件 (click事件、hover事件、mouse事件等鼠标事件) 他当然不止一个属性值还有其他的某些

    2024年02月10日
    浏览(32)
  • 在 QML 中,ComboBox 是一种常用的用户界面控件,通常用于提供一个下拉式的选择框,允许用户从预定义的选项列表中选择一个值

    ComboBox 详解: 以下是 ComboBox 的一些重要属性和特性: model : 用于指定 ComboBox 中的选项列表,可以是一个数组、列表、模型或者其他可迭代的数据结构。 editable : 用于指定是否允许用户编辑 ComboBox 中的文本输入框,以便输入非预定义的选项。 currentIndex : 用于获取或设置当前

    2024年04月15日
    浏览(33)
  • Simple WPF:实现一个透明、无边框、鼠标穿透的WPF窗体

    一个自定义WPF窗体的解决方案,借鉴了吕毅老师的WPF制作高性能的透明背景的异形窗口一文,并在此基础上增加了鼠标穿透的功能。可以使得透明窗体的鼠标事件穿透到下层,在下层窗体中响应。这一功能在开发一些截图工具,直播、会议标注工具的时候会有比较多的应用,

    2024年02月09日
    浏览(81)
  • qml使用QAbstractListModel作为数据源

    在日常开发中界面为了快速并且炫酷,大家可能会选择qml作为主体。但是后台数据的提供还是用qt c++的实现,MVC中即可用Model进行。例如:QAbstractListModel 一般的使用只实现下面三个函数即可支撑qml中的交互: 但是想要一些其他的功能,就需要自己去实现了! 一、例如想进行

    2024年02月11日
    浏览(28)
  • python图形界面化编程GUI(三)事件绑定(鼠标和键盘、OptionMenu、scale、颜色、文件对话框、菜单和工具栏、ttk子模块)

    Tkinter类 名称 简介 Toplevel 顶层 容器类,可用于为其他组件提供单独的容器,类似于窗口 Button 按钮 代表按钮组件 Canvas 画布 提供绘图功能,包括直线、矩形、椭圆、多边形、位图等 Entry 单行输入框 用户可输入内容 Frame 容器 用于装载其他GUI组件 Label 标签 用于显示不可编辑

    2024年02月12日
    浏览(36)
  • 精心打造:使用easyx做界面时,想要鼠标到一个按键时背景颜色发生改变

    我们在用easyx开发小的应用程序时(比如写表白程序doge),感觉很高级,但还要注意一些细节的东西以使我们的程序变得更完美,也让客户(或者你的女朋友)感觉到你的细心以及注意细节,不得不面临一些细节的难题。 这里要说的就是如何使鼠标与界面进行交互,包括以下

    2024年02月09日
    浏览(41)
  • QML键盘事件

    在QML中,当有一个按键按下或释放时,会产生一个键盘事件,将其传递给获得有焦点的QML项目(讲focus属性设置为true,则获得焦点)。 按键处理的基本流程: Qt接收密钥操作并生成密钥事件。 如果 QQuickWindow 是活动窗口,则密钥事件将传递给它。 关键事件由场景传递到 具

    2024年02月09日
    浏览(22)
  • QML 键盘事件

    作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 和鼠标一样,键盘同样也提供了用户交互的能力,所以在介绍完《QML 鼠标事件》之后,是时候深入键盘事件了。 在 QML 中,有一个附加属性 - Keys,是专供可视元素进行按键处理的。当用户按下或释放一个按

    2024年02月10日
    浏览(19)
  • 【QML】鼠标放在控件上颜色改变的效果实现

    最近刚好要用到一个功能,在qml上实现鼠标放上去,控件的颜色改变,鼠标移走,控件颜色恢复。第一反应是这个功能非常简单,但是搞了一会儿都没实现,最后发现MouseArea其实提供了一个很简便的方法来提供使用,这里做个记录: 效果图如下:

    2024年02月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包