问题描述
此问题在Windows上发生,但在Linux上不发生。我没有尝试过其他平台。
我有一个自定义类(下面的代码),该类使用QCursor
来设置鼠标位置。
import QtQuick 2.15
import QtQuick.Window 2.15
// Custom C++ class,implementation below
import io.github.myProject.utilities.mousehelper 1.0
Window {
visible: true
width: 800
height: 600
MouseHelper { id: mouseHelper }
MouseArea {
id: mouseArea
hoverEnabled: true
anchors.fill: parent
property var p
onpressed: {
p = mouseArea.mapToGlobal(
mouseArea.width * 0.5,mouseArea.height * 0.5);
mouseHelper.setCursorPosition(0,0);
}
onReleased: {
mouseHelper.setCursorPosition(p.x,p.y);
}
onExited: {
console.log('This should happen twice,but it only happens once.');
}
}
}
重现此问题的步骤:
- 将鼠标放在窗口上。光标将移动到屏幕的左上角,并且
onExited
将触发。 - 释放鼠标按钮。光标将跳到窗口的中间。
- 将鼠标移出窗口。
onExited
应该会再次触发,但不会。有什么办法可以我
- 引起火灾,或
- 是否检测到鼠标已移出鼠标区域?
onPositionChanged
仍然会触发,但是我只能用它来检测鼠标何时靠近MouseArea
的边缘,而不是何时离开。
我尝试将全局MouseArea
覆盖在上面,并通过所有事件,以进行一些手动的特殊情况位置检查,但是我无法通过悬停事件。
设置鼠标位置的类:
#ifndef MOUSEHELPER_H
#define MOUSEHELPER_H
#include <QObject>
#include <QCursor>
class MouseHelper : public QObject {
Q_OBJECT
public:
explicit MouseHelper(QObject *parent = nullptr);
Q_INVOKABLE void setCursorPosition(int x,int y);
signals:
public slots:
};
#endif // MOUSEHELPER_H
#include "mousehelper.h"
#include <QGuiApplication>
MouseHelper::MouseHelper(QObject *parent) : QObject(parent) {}
void MouseHelper::setCursorPosition(int x,int y) {
QCursor::setPos(x,y);
}
int main(int argc,char *argv[]) {
// ...
qmlRegisterType<MouseHelper>("io.github.myProject.utilities.mousehelper",1,"MouseHelper");
}
然后我可以将其导入QML并使用。
解决方法
作为解决问题的方法,您可以使用计时器重置鼠标光标的位置。
在QML中都是:
MouseArea {
...
Timer {
id: timer
interval: 10
repeat: false
onTriggered: {
mouseHelper.setCursorPosition(mouseArea.p.x,mouseArea.p.y)
}
}
onReleased: {
timer.start()
}
...
}
或在您的MouseHelper类中:
#include <QTimer>
...
void MouseHelper::setCursorPosition(int x,int y) {
QTimer::singleShot(10,this,[x,y]() { QCursor::setPos(x,y); });
}
如果计时器的间隔不太短,这对我有用。