【发布时间】:2017-11-23 08:56:00
【问题描述】:
我正在用 QML 编写一个小型 PoC。在我的代码中的几个地方,我需要绑定/查询全局鼠标位置(例如,场景或游戏窗口中的鼠标位置)。即使鼠标位于我迄今为止定义的 MouseAreas 之外。
环顾四周,唯一的方法似乎是用另一个 MouseArea 覆盖整个屏幕,很可能启用了悬停。然后我还需要处理向底层 mouseAreas 半手动传播(悬停)事件..
我在这里遗漏了什么吗?这似乎是一个很常见的情况 - 有没有更简单/更优雅的方法来实现它?
编辑: 最有问题的情况似乎是在鼠标区域外拖动时。下面是一个简约的示例(它使用 V-Play 组件和来自 derM 的答案的鼠标事件间谍)。当我单击图像并拖动到 MouseArea 之外时,鼠标事件不再出现,因此除非下面有 DropArea,否则无法更新位置。
MouseEventSpy取自 here 以响应其中一个答案。它仅被修改为将位置作为参数包含在信号中。
import VPlay 2.0
import QtQuick 2.0
import MouseEventSpy 1.0
GameWindow {
id: gameWindow
activeScene: scene
screenWidth: 960
screenHeight: 640
Scene {
id: scene
anchors.fill: parent
Connections {
target: MouseEventSpy
onMouseEventDetected: {
console.log(x)
console.log(y)
}
}
Image {
id: tile
x: 118
y: 190
width: 200
height: 200
source: "../assets/vplay-logo.png"
anchors.centerIn: parent
Drag.active: mausA.drag.active
Drag.dragType: Drag.Automatic
MouseArea {
id: mausA
anchors.fill: parent
drag.target: parent
}
}
}
}
【问题讨论】:
-
能否也提供
MouseEventSpy的修改代码? -
几乎没有修改,我将信号原型改为:
void mouseEventDetected(int x, int y);,然后:... && event->spontaneous()) { QMouseEvent * me = (QMouseEvent*) event; emit mouseEventDetected(me->globalX(), me->globalY()); } -
好像和
Drag.dragType有关。如果注释掉,它似乎工作。我看看能不能找到解决办法。 -
查看我的编辑以获取修复。您需要处理
QDragMoveEvents 的情况。 -
我将链接添加到
MouseEventSpy,否则您的示例将不完整。