QML MouseArea 鼠标事件详解

鼠标区域是一个不可见的项目,通常与可见项目一起使用,以便为该项目提供鼠标处理。通过有效地充当代理,鼠标处理逻辑可以包含在MouseArea项中。

有关MouseArea和按钮单击的信息是通过为其定义事件处理程序属性的信号提供的。最常用的是处理鼠标的按下和点击:onClicked, onDoubleClicked, onPressed, onReleased 和 onPressAndHold。也可以通过onWheel信号处理鼠标滚轮事件。

如果一个MouseArea 与其他鼠标区域项目的区域重叠,可以通过将propagateComposedEvents设置为true并拒绝应该传播的事件,选择将单击、双击和按下按住事件传播到这些其他项目。

以下讲解,均在Window部件中进行!

Window {id: rootvisible: truewidth: 400height: 500title: qsTr("Hello World")color: "white"//MouseArea { }
}

1.鼠标按下事件

onClicked                鼠标按下然后松开触发

onDoubleClicked        鼠标双击触发

onPressed                鼠标按下触发

onReleased                鼠标松开触发

MouseArea {id: mouseAreawidth: 200height: 200// 为了让鼠标区域显示出来Rectangle {anchors.fill: parentcolor: "gray"}onClicked:  {console.log("clicked");}onDoubleClicked: {console.log("double clicked")}onPressed:  {console.log("pressed");}onReleased: {console.log("release")}
}

1).如何区分是左键按下还是右键按下?

使用 pressedButtons 属性可用于区分;

另外,还需要用到 acceptedButtons 属性acceptedButtons: Qt.LeftButton | Qt.RightButton 还需监听左和右;

之后,就可以在onPressed槽函数中,pressedButtons属性和 Qt.LeftButton 或者 Qt.RightButton 做 & 操作,得出数值;

如果 pressedButtons & Qt.LeftButton 为1,那么就是左键按下;

如果 pressedButtons & Qt.RightButton 为2,那么就是右键按下;

  MouseArea {id: mouseAreawidth: 200height: 200// 设置监听鼠标的左键和右键acceptedButtons: Qt.LeftButton | Qt.RightButton// 为了让鼠标区域显示出来Rectangle {anchors.fill: parentcolor: "gray"}onPressed:  {//console.log("pressed");// pressedButtons & 按钮枚举   - 可知道是哪个按下var left = pressedButtons & Qt.LeftButtonvar right = pressedButtons & Qt.RightButtonconsole.log("left:", left, "  right", right)if (1 == left) {console.log("mouse left pressed.")} else if (2 == right) {console.log("mouse right pressed.")} else {console.log("other pressed.")}}onReleased: {console.log("release")}
}

打印0表示没按下!

onContainsPressChanged: { } onContainsMouseChanged: { }

槽函数也可以处理鼠标按下;

不过其有点特殊,鼠标按下时会触发,松开后也会触发一次;

onContainsMouseChanged: {                         console.log("containsMouse", containsMouse)   
}                                                 onContainsPressChanged: {                         console.log("containsPress", containsPress)                                             
}                                          

按下时,值为true,松开后,值为false;

当然,在 onContainsPressChanged: { } 内,也可以使用 pressedButtons 属性去判断鼠标左键还是右键按下!

onContainsMouseChanged: { } 却不可以!

不过,onContainsMouseChanged: { } 可以和鼠标悬浮一起使用!

当启动鼠标悬浮后,鼠标指针进入鼠标区域,即可触发onContainsMouseChanged: { }

2).鼠标长按

onPressAndHold: { } 槽函数可以在鼠标长按时执行;

可通过 pressAndHoldInterval 属性去设置长按的时间;

MouseArea {id: mouseAreawidth: 200height: 200// 为了让鼠标区域显示出来Rectangle {anchors.fill: parentcolor: "gray"}// 鼠标长按时触发pressAndHoldInterval: 2000onPressAndHold: {console.log("长按...")}
}

2.鼠标悬浮

鼠标悬浮,即鼠标指针悬浮在鼠标区域内,所触发的一些操作;

将 hoverEnabled 属性设置为true,即可启动鼠标悬浮;

除了上面说的onContainsMouseChanged: { } 会触发后,还有什么会触发吗?

有的,其本身也会触发一个槽函数 onHoveredChanged: { } ;

MouseArea {id: mouseAreawidth: 200height: 200// 为了让鼠标区域显示出来Rectangle {anchors.fill: parentcolor: "gray"}// 设置监听鼠标的左键和右键acceptedButtons: Qt.LeftButton | Qt.RightButton// 启动悬浮hoverEnabled: trueonHoveredChanged: {console.log("onHoveredChanged")}// 只有hoverEnabled设置为true时,onContainsMouseChanged在鼠标悬浮时会触发;否则只有鼠标按下时才会触发onContainsMouseChanged: {console.log("containsMouse", containsMouse)}
}

另外,可以通过 cursorShape 属性改变悬浮时鼠标的指针;

// 当启动悬浮后,可设置悬浮时鼠标指针            
cursorShape: Qt.ClosedHandCursor

更多请查看帮助文档的 Qt::CursorShape 枚举;

3.鼠标按下拖动

使用 drag 属性,可以通过鼠标拖动部件;

其中需要设置几个重要的属性;

drag.target         目标id
drag.axis          移动方向,可以是 (Drag.XAxis), (Drag.YAxis), or both (Drag.XAndYAxis)
drag.minimum 和 drag.maximum  最大值xy和最小是xy;

Rectangle {                                                                             id: rect                                                                            width: 50; height: 50                                                               color: "red"                                                                        // 越往右边,透明度越小                                                                       //opacity: (root.width - rect.x) / root.width                                       MouseArea {                                                                         anchors.fill: parent                                                            // drag 提供了一种方便的方法来使项目可拖动                                                       drag.target: rect                                                               // 移动方向                                                                         drag.axis: Drag.XAndYAxis   // Drag.XAxis or Drag.YAxis or both Drag.XAndYAxis  // 设置移动的范围                                                                      drag.minimumX: 0                                                                drag.maximumX: root.width - rect.width                                          drag.minimumY: 0                                                                drag.maximumY: root.height - rect.height                                        }
}          

drag 的 filterChildren 属性,如果设置为false,其子部件点击是不可以拖动的,例如:
Rectangle {                                        id: rect                                       x: 30; y: 30                                   width: 300; height: 240                        color: "lightsteelblue"                        MouseArea {                                    anchors.fill: parent                         drag.target: rect;                           drag.axis: Drag.XAxis | Drag.YAxis           drag.minimumX: 0                             drag.maximumX: root.width - rect.width       drag.minimumY: 0                             drag.maximumY: root.height - rect.height     // 如果为true,点击子部件可以拖动;false则不行                drag.filterChildren: true                    Rectangle {                                  color: "yellow"                          x: 50; y : 50                            width: 100; height: 100                  MouseArea {                              anchors.fill: parent                 onClicked: console.log("Clicked")    }                                        }                                            }                                              
}                                               

4.鼠标点击事件穿透

还有一个比较有意思的就是,

有一个矩形1,其内部也还有一个矩形2,当我们点击矩形1的时候,打印矩形1,当我们点击矩形2的时候,打印矩形2;

那么请问,如果我想在点击矩形2的时候,也会触发矩形1的打印,这该如何实现呢?

可以设置  mouse.accepted = false

和设置 propagateComposedEvents: true

即可实现!

Rectangle {                                       color: "yellow"                               width: 100; height: 100                       MouseArea {                                   anchors.fill: parent                      onClicked: console.log("clicked yellow")  }                                             Rectangle {                                   color: "blue"                             width: 50; height: 50                     MouseArea {                               anchors.fill: parent                  propagateComposedEvents: true       onClicked: {                          console.log("clicked blue")       mouse.accepted = false          }                                     }                                         }                                             
}              

5.总结

一般来说,鼠标事件,最常用的就是按下事件了,一般都是按下后做一些处理操作,只需要掌握之一部分内容就基本可以了;

其余用法现在有个影响,等到实际项目遇到时,再翻看一下qt帮助手册。

完!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22435.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统思考—结构影响行为

“付费是对价值的认可,它是承诺的体现,是我们共同走向未来的信任。” — 吉姆柯林斯 在组织中,结构的影响几乎无处不在。它不仅定义了我们的流程、职能和角色,更在不知不觉中塑造了我们日常的行为和决策方式。每一次决策、每一个…

嵌入式标志位解决程序卡顿问题

在写程序实现多个功能时发现会因为延时时间长导致其他功能程序无法运行问题 例如在写闹钟程序时,如果闹钟响灯亮5秒,这五秒期间会导致led显示的时间停止更细,等五秒过后直接显示5秒后正确的时间。这个因为程序是顺序运行的,延时时…

BFS算法解决最短路径问题(典型算法思想)—— OJ例题算法解析思路

目录 一、1926. 迷宫中离入口最近的出口 - 力扣(LeetCode) 算法代码: 代码分析 各个部分的解释 注意事项 整体的含义 具体情况 使用 e[0] 和 e[1] 的优势 总结 示例代码中的用法 整体流程 示例 复杂度分析 总结 二、433. 最小基…

《Europe From Above》鸟瞰欧洲(意境欧洲)@ 第三季

目录 第1集 爱尔兰克罗克公园灰海豹保护团队防风石墙无线电望远镜水产凤凰公园农业惊艳瞬间 第2集 挪威第3集 克罗地亚第4集 葡萄牙第5集 冰岛第6集 瑞士制作与播出信息 第1集 爱尔兰 本集聚焦爱尔兰的自然与人文交融: 克罗克公园 首都都柏林的克罗克公园&#x…

cs106x-lecture14(Autumn 2017)-SPL实现

打卡cs106x(Autumn 2017)-lecture14 (以下皆使用SPL实现,非STL库,后续课程结束会使用STL实现) 1、min Write a function named min that accepts a pointer to a ListNode representing the front of a linked list. Your function should return the …

【HeadFirst系列之HeadFirstJava】第4天之理解对象的行为:方法操作实例变量

理解对象的行为:方法操作实例变量 在《Head First Java》的第四章节中,作者深入探讨了对象的行为,即方法如何操作实例变量。这一章节的核心思想是:对象的行为由其方法定义,而方法通过操作实例变量来实现这些行为。理解…

自注意力机制和CNN的区别

CNN:一种只能在固定感受野范围内进行关注的自注意力机制。​CNN是自注意力的简化版本。自注意力:具有可学习感受野的CNN。自注意力是CNN的复杂形态,是更灵活的CNN,经过某些设计就可以变为CNN。 越灵活、越大的模型,需要…

网络运维学习笔记 012网工初级(HCIA-Datacom与CCNA-EI)某机构新增:GRE隧道与EBGP实施

文章目录 GRE隧道(通用路由封装,Generic Routing Encapsulation)协议号47实验:思科:开始实施: 华为:开始实施: eBGP实施思科:华为: GRE隧道(通用路…

Mac m1 连接公司内网

1、创建VPN 1、在系统偏好设置 2、选择网络 3、进行添加 2、添加设置 1、选择VPN 2、类型选择L2TP/IPSec 3、填写服务器IP和账号 4、点击认证设置-填写密码 。然后应用 3、进行特殊配置 网上说苹果系统的问题。 1、创建命令 sudo vim /etc/ppp/options 2、添加内容-主要别…

【多模态处理篇七】【DeepSeek传感器融合:IMU+视觉SLAM方案】

大家好,今天我们来聊聊一个非常酷的技术——DeepSeek传感器融合:IMU+视觉SLAM方案。这个技术在现代机器人、自动驾驶、AR/VR等领域都有广泛的应用。我们将从基础概念开始,逐步深入到核心原理和实现细节,力求让大家对这个技术有一个全面而深入的理解。 1. 什么是SLAM? 首…

医疗报销系统的设计与实现(代码+数据库+LW)

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,报销单信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足…

LangChain 技术入门指南:探索语言模型的无限可能

在当今的技术领域,LangChain 正逐渐崭露头角,成为开发语言模型应用的强大工具。如果你渴望深入了解并掌握这一技术,那么就跟随本文一起开启 LangChain 的入门之旅吧! (后续将持续输出关于LangChain的技术文章,有兴趣的同学可以关注…

windows服务器本地部署deepseek并训练

1.安装python3.10 下载地址 Index of python-local/3.10.9 安装64位windows版本 2.下载到LLaMA-Factory github地址: GitHub - hiyouga/LLaMA-Factory: Unified Efficient Fine-Tuning of 100 LLMs & VLMs (ACL 2024) 3. 修改pip镜像源 -- 将pip使用镜像源更…

孜然单授权系统V2.0PHP授权系统

孜然单授权V1.0系统,延续了2022年开发的孜然多应用授权系统V2.0 变更:多应用变单系统,去除没用的垃圾代码,从0开发,去除了一些没用的功能 完善了开发文档,之前那套是我写着玩的屎山代码,V1.0将展…

智慧校园系统在学生学习与生活中的应用

随着科技的快速发展,智慧校园系统逐渐成为现代教育不可或缺的一部分。它整合了先进的信息技术、物联网技术以及人工智能等,旨在构建一个全面、智能、个性化的学习与生活环境。对于学生而言,这一系统不仅能够极大地提高学习效率,还…

论文笔记-WWWCompanion2024-LLM as Data Augmenters for Cold-Start Item Recommendation

论文笔记-WWW Companion 2024-Large Language Models as Data Augmenters for Cold-Start Item Recommendation 大语言模型作为冷启动项目推荐的数据增强器摘要1.引言2.前言3.LLMs作为数据增强3.1增强数据生成3.2成对比较损失 4.实验4.1实验设置4.2结果和分析4.3超参数实验 5.总…

antv G6绘制流程图

效果图&#xff08;优点&#xff1a;可以自定义每一条折线的颜色&#xff0c;可以自定义节点的颜色&#xff0c;以及折线的计算样式等&#xff09;&#xff1a; 代码&#xff1a; <!-- 流程图组件 --> <template><div id"container"></div>…

(三)趣学设计模式 之 抽象工厂模式!

目录 一、 啥是抽象工厂模式&#xff1f;二、 为什么要用抽象工厂模式&#xff1f;三、 抽象工厂模式怎么实现&#xff1f;四、 抽象工厂模式的应用场景五、 抽象工厂模式的优点和缺点六、 抽象工厂模式与工厂方法模式的区别七、 总结 &#x1f31f;我的其他文章也讲解的比较有…

【GPU驱动】OpenGLES图形管线渲染机制

OpenGLES图形管线渲染机制 OpenGL/ES 的渲染管线也是一个典型的图形流水线&#xff08;Graphics Pipeline&#xff09;&#xff0c;包括多个阶段&#xff0c;每个阶段都负责对图形数据进行处理。管线的核心目标是将图形数据转换为最终的图像&#xff0c;这些图像可以显示在屏幕…

vscode软件中引入vant组件

一、vant简介 Vant 是一个轻量、可靠的移动端组件库&#xff0c;于 2017 年开源。 目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本&#xff0c;并由社区团队维护 React 版本和支付宝小程序版本。 官网&#xff1a;介绍 - Vant Weapp 里面的快速上手的教程&a…