问题描述
此问题在Windows上发生,但在Linux上不发生。我没有尝试过其他平台。
我有一个自定义类(下面的代码),该类使用QCursor
来设置鼠标位置。
问题在于以下代码(repo):
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);
}
我在主要功能中使用QML将此类注册为类型:
int main(int argc,char *argv[]) {
// ...
qmlRegisterType<MouseHelper>("io.github.myProject.utilities.mousehelper",1,"MouseHelper");
}
然后我可以将其导入QML并使用。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)