我正在用QML编写一个小型PoC。在我的代码中的几个地方,我需要绑定/查询全局鼠标位置(例如,在场景或游戏窗口中的鼠标位置)。即使在鼠标不在我定义的MouseAreas之外的情况下也是如此。
环顾四周,唯一的方法似乎是用另一个MouseArea覆盖整个屏幕,很可能是启用了悬停。然后,我还需要处理半手动传播(悬停)事件到底层mouseAreas。
我是不是漏掉了什么?这似乎是一个相当常见的情况--是否有一种更简单、更优雅的方法来实现这一目标?
编辑:最有问题的情况似乎是在拖出一个MouseArea时。下面是一个极简的例子(它使用Below组件和derM的答案中的鼠标事件间谍)。当我单击图像并拖动到MouseArea外部时,鼠标事件不再出现,因此除非下面有一个DropArea,否则不能更新位置。
MouseEventSpy是从这里中提取的,以响应其中的一个答案。它只被修改为将位置作为信号的参数。
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
}
}
}
}发布于 2017-11-23 19:15:47
您可以在eventFilter上安装一个QGuiApplication,在那里所有鼠标事件都会通过。
如何做到这一点被描述为这里
在链接解决方案中,当发出信号时,我会删除有关鼠标位置的信息。但是,您可以通过将传递给eventFilter(...)-method的eventFilter(...)-method转换为QMouseEvent并将其作为参数添加到信号中来轻松检索信息。
在链接答案中,我将其注册为QML和C++中可用的单例,这样您就可以在任何需要的地方连接到信号。
由于它是在链接的答案中提供的,MouseEventSpy将只处理各种类型的QMouseEvents。一旦开始拖动某个东西,就不会出现QMouseEvents,而是QDragMoveEvents e.t.c。因此,您需要扩展filter方法,以处理这些问题。
bool MouseEventSpy::eventFilter(QObject* watched, QEvent* event)
{
QEvent::Type t = event->type();
if (t == QEvent::MouseButtonDblClick
|| t == QEvent::MouseButtonPress
|| t == QEvent::MouseButtonRelease
|| t == QEvent::MouseMove) {
QMouseEvent* e = static_cast<QMouseEvent*>(event);
emit mouseEventDetected(e->x(), e->y());
}
if (t == QEvent::DragMove) {
QDragMoveEvent* e = static_cast<QDragMoveEvent*>(event);
emit mouseEventDetected(e->pos().x(), e->pos().y());
}
return QObject::eventFilter(watched, event);
}然后,您可以将坐标转换为您需要的任何东西(屏幕、窗口、.)
发布于 2017-11-23 09:06:37
由于您只有几个地方需要查询全局鼠标位置,所以我建议您使用mapToGlobal或mapToItem方法。
发布于 2017-11-23 12:09:50
我相信你可以从C++侧得到光标的坐标。看看这个问题上的答案。这个问题与你的问题无关,但解决方案也同样有效。
在我这方面,我通过直接调用mousePosProvider.cursorPos()而没有任何MouseArea来获得全局坐标。
https://stackoverflow.com/questions/47451218
复制相似问题