按下 MouseEvents 时获取 MouseEvents
Get MouseEvents while MousePressed
我有几个 QML 项目都有鼠标区域。
我要实现的是:
- 单击其中一项并开始跟踪鼠标
- 将鼠标输入的所有其他项目添加到列表中
- 松开鼠标结束跟踪
示例代码:
import QtQuick 2.3
import QtQuick.Window 2.2
Window {
visible: true
width:500; height: 200;
Rectangle{
anchors.left: parent.left
color: 'red'
width: 200; height: 200;
MouseArea {
anchors.fill: parent
hoverEnabled: true
onReleased: console.log('onReleased red')
onEntered: console.log('onEntered red')
onPressed: {
console.log('onPressed red')
mouse.accepted = false
}
}
}
Rectangle{
anchors.right: parent.right
color: 'blue'
width: 200; height: 200;
MouseArea {
anchors.fill: parent
hoverEnabled: true
onReleased: console.log('onReleased blue')
onEntered: console.log('onEntered blue')
onPressed: console.log('onPressed blue')
}
}
}
预期行为:
- 单击一个矩形
- 如果我输入其他元素,则进入输入的事件
- 获取发布事件
示例代码有我试过的两个版本,接受和不接受 mousePressed
事件。
发生的事情是:
如果我在一个矩形上按下鼠标,我不会得到所有其他矩形的 onEnter
事件。
如果我不接受 onPressed
事件,我会得到 onEnter
事件而不是 onReleased
事件。
注:
我已经找到 this Answer 它使用 DropArea 作为解决方法,如果有任何其他解决方案,我不想使用它。
尽管示例可能看起来像拖放操作,但这不是我想要的。
请参阅此问题顶部的 "What I want to achieve"。
仅使用标准 MouseArea 组件将无法实现您想要的效果。标准 QML 组件的功能有点受限。
您要做的是通过 QML 扩展创建您自己的 MouseArea 组件。
在我们的项目中,我们也遇到了很多关于鼠标处理的问题,所以我们是如何做到的:
Subclassed QQuickItem,在这个 class 内部,我们只是跟踪鼠标移动和鼠标按钮状态。一件重要的事情是安装由此 class.
定义的 EventFilters
在 QML 中,创建了一个检查鼠标是否在当前组件内部的简单组件。
如果您需要,我也可以 post 在此处提供代码,以便您了解。
实施不是最漂亮的,但它有效
我有几个 QML 项目都有鼠标区域。
我要实现的是:
- 单击其中一项并开始跟踪鼠标
- 将鼠标输入的所有其他项目添加到列表中
- 松开鼠标结束跟踪
示例代码:
import QtQuick 2.3
import QtQuick.Window 2.2
Window {
visible: true
width:500; height: 200;
Rectangle{
anchors.left: parent.left
color: 'red'
width: 200; height: 200;
MouseArea {
anchors.fill: parent
hoverEnabled: true
onReleased: console.log('onReleased red')
onEntered: console.log('onEntered red')
onPressed: {
console.log('onPressed red')
mouse.accepted = false
}
}
}
Rectangle{
anchors.right: parent.right
color: 'blue'
width: 200; height: 200;
MouseArea {
anchors.fill: parent
hoverEnabled: true
onReleased: console.log('onReleased blue')
onEntered: console.log('onEntered blue')
onPressed: console.log('onPressed blue')
}
}
}
预期行为:
- 单击一个矩形
- 如果我输入其他元素,则进入输入的事件
- 获取发布事件
示例代码有我试过的两个版本,接受和不接受 mousePressed
事件。
发生的事情是:
如果我在一个矩形上按下鼠标,我不会得到所有其他矩形的 onEnter
事件。
如果我不接受 onPressed
事件,我会得到 onEnter
事件而不是 onReleased
事件。
注:
我已经找到 this Answer 它使用 DropArea 作为解决方法,如果有任何其他解决方案,我不想使用它。
尽管示例可能看起来像拖放操作,但这不是我想要的。 请参阅此问题顶部的 "What I want to achieve"。
仅使用标准 MouseArea 组件将无法实现您想要的效果。标准 QML 组件的功能有点受限。 您要做的是通过 QML 扩展创建您自己的 MouseArea 组件。 在我们的项目中,我们也遇到了很多关于鼠标处理的问题,所以我们是如何做到的:
Subclassed QQuickItem,在这个 class 内部,我们只是跟踪鼠标移动和鼠标按钮状态。一件重要的事情是安装由此 class.
定义的 EventFilters
在 QML 中,创建了一个检查鼠标是否在当前组件内部的简单组件。
如果您需要,我也可以 post 在此处提供代码,以便您了解。 实施不是最漂亮的,但它有效