[QML] 交互事件深度解析:鼠标、键盘、拖拽

张开发
2026/4/15 3:11:24 15 分钟阅读

分享文章

[QML] 交互事件深度解析:鼠标、键盘、拖拽
一 鼠标事件核心组件MouseArea鼠标交互事件鼠标是 QML 中最基础的交互方式。通过MouseArea元素我们可以捕获点击、悬停、按下、释放以及滚轮滚动等事件。核心知识点MouseArea: 必须将其anchors.fill: parent才能覆盖整个父组件否则只有有内容的区域才能响应。hoverEnabled: true: 这是一个关键属性。默认情况下MouseArea只有在鼠标按下时才会跟踪鼠标。开启此属性后才能在鼠标仅经过不按下时触发onEntered和onExited。onWheel: 用于处理鼠标滚轮事件wheel.angleDelta.y用于判断滚动方向import QtQuick import QtQuick.Window Window { width: 400 height: 300 visible: true title: 1. 鼠标事件演示 Rectangle { width: 200 height: 200 color: mouseArea.containsMouse ? lightgreen : lightgray text: 鼠标移入变绿滚轮打印日志 anchors.centerIn: parent MouseArea { id: mouseArea anchors.fill: parent hoverEnabled: true // 关键开启悬停支持 // 鼠标点击 onClicked: { console.log(鼠标被点击了) } // 鼠标进入区域 onEntered: { console.log(鼠标进入了区域) } // 鼠标离开区域 onExited: { console.log(鼠标离开了区域) } // 滚轮滚动 onWheel: function(wheel) { if (wheel.angleDelta.y 0) { console.log(滚轮向上滚动) } else { console.log(滚轮向下滚动) } } } } }二 键盘事件在 QML 中键盘事件通常绑定在具有focus属性的元素上如Rectangle,TextInput等。核心知识点focus: true:这是最容易忘记的一步。如果组件没有获取焦点它就无法接收键盘事件。通常需要在组件加载时强制获取焦点或者通过点击来获取焦点。Keys附加属性: 用于定义按键处理逻辑如Keys.onPressed或具体的按键Keys.onSpacePressed。事件处理: 可以在按键事件中修改组件的属性如坐标x,y。这个示例有个很值得注意的点:keyRect.color.toString() 为什么不直接比较,因为和有可能永远无法比较成功.因为 QML 里的color属性其实是个“多面手”它的类型非常灵活直接拿它跟字符串比经常会因为类型不匹配或者格式不统一而踩雷。import QtQuick import QtQuick.Window Window { width: 400 height: 300 visible: true title: 2. 键盘事件演示 Rectangle { id: keyRect width: 150 height: 150 color: cyan anchors.centerIn: parent focus: true // 关键必须设置为 true 才能接收键盘事件 Text { text: 选中我按方向键移动按空格变色 anchors.centerIn: parent color: black } // 方向键移动 Keys.onLeftPressed: keyRect.x - 10 Keys.onRightPressed: keyRect.x 10 Keys.onUpPressed: keyRect.y - 10 Keys.onDownPressed: keyRect.y 10 // 空格键变色逻辑 Keys.onSpacePressed: { if (keyRect.color.toString() #00ffff) { keyRect.color #ff00ff // 变洋红 console.log(颜色已切换为洋红) } else { keyRect.color #00ffff // 变回青色 console.log(颜色已切换为青色) } } } }三 拖拽事件QML 的拖拽系统非常强大主要依赖于MouseArea的drag附加属性。核心知识点drag.target: 指定被拖拽的目标对象通常是父组件本身。drag.axis: 限制拖拽的轴向。Drag.XAndYAxis表示允许水平和垂直移动也可以设置为Drag.XAxis仅允许水平移动。Drag.active: 这是一个只读属性表示当前是否正在进行拖拽操作。常用于与其他组件如DropArea进行交互。核心代码:Drag.active: mouseArea.drag.active这行代码就是一个“状态透传”把鼠标区域检测到的“正在拖拽”状态赋值给方块让方块告诉全世界“我正在被拖拽中请对我做出反应”它的作用是向外界广播“我现在处于拖拽活跃状态”。import QtQuick Window { width: 640 height: 480 visible: true title: qsTr(Hello World) DropArea { width: 300 height: 300 x:200 Rectangle { color:cyan id:rg2 anchors.fill: parent } onEntered: { rg2.color pink } onExited: { rg2.color cyan } } Rectangle { id:rg1 width: 100 height: 100 Drag.active: mouseArea.drag.active MouseArea { id:mouseArea anchors.fill: parent drag.target: rg1 drag.axis: Drag.XAndYAxis } } }

更多文章