Qt QML MouseArea:onexitted不';以编程方式将鼠标移动到MouseArea后,将不会触发
此问题在Windows上发生,但在Linux上不发生。我没有尝试过其他平台 我有一个自定义类(下面的代码),它使用Qt QML MouseArea:onexitted不';以编程方式将鼠标移动到MouseArea后,将不会触发,qt,qml,mousearea,Qt,Qml,Mousearea,此问题在Windows上发生,但在Linux上不发生。我没有尝试过其他平台 我有一个自定义类(下面的代码),它使用QCursor设置鼠标位置 问题在于以下代码(): 重现问题的步骤: 把鼠标放在窗户上。光标将移动到屏幕的左上角,并触发onExited 松开鼠标按钮。光标将跳到窗口的中间 将鼠标移出窗口 当用户将鼠标移出窗口时,onExited应再次启动,但不会启动。有什么办法我也可以吗 使其着火,或 否则,是否检测到鼠标已移出鼠标区域 onPositionChanged仍会激发,但我只能用它来检
QCursor
设置鼠标位置
问题在于以下代码():
重现问题的步骤:
onExited
onExited
应再次启动,但不会启动。有什么办法我也可以吗
onPositionChanged
仍会激发,但我只能用它来检测鼠标何时靠近MouseArea
的边缘,而不是鼠标何时离开
我试着在顶部覆盖一个全局的MouseArea
,并传递所有事件,作为手动特殊情况位置检查的一种方式,但我无法传递悬停事件
用于设置鼠标位置的类:
\ifndef MOUSEHELPER\u H
#定义鼠标帮助器
#包括
#包括
类鼠标帮助器:公共QObject{
Q_对象
公众:
显式鼠标帮助器(QObject*parent=nullptr);
Q_可调用的void setCursorPosition(intx,inty);
信号:
公众时段:
};
#endif//MOUSEHELPER\u H
#包括“mousehelper.h”
#包括
MouseHelper::MouseHelper(QObject*parent):QObject(parent){}
void MouseHelper::setCursorPosition(int x,int y){
QCursor::setPos(x,y);
}
我在主函数中将该类注册为QML类型:
intmain(intargc,char*argv[]){
// ...
qmlRegisterType(“io.github.myProject.utilities.mousehelper”,
1,0,“鼠标助手”);
}
然后,我可以将其导入QML并使用它。作为解决问题的方法,您可以使用计时器重置鼠标光标的位置 在QML中:
MouseArea{
...
计时器{
id:计时器
间隔时间:10
重复:错
反对:{
鼠标帮助器设置光标位置(鼠标earea.p.x、鼠标earea.p.y)
}
}
发布日期:{
timer.start()
}
...
}
或者在您的MouseHelper类中:
#包括
...
void MouseHelper::setCursorPosition(int x,int y){
QTimer::singleShot(10,this,[x,y](){QCursor::setPos(x,y);});
}
如果计时器的间隔不太小,这对我很有效。您显示的代码似乎是以编程方式进入区域2,而不是退出。我一定错过了什么。@JarMan对不起!它以编程方式进入
区域2
。问题是,我无法检测用户何时将鼠标移出区域2
,因为只有当用户像正常情况一样将鼠标移至区域2
时,onExited
事件才会触发-我猜以编程方式移动鼠标不会“计数”,因此,它不知道如何跟踪退出的onExited
?。@JoshuaWade是的,在linux上没有问题,我在linux和windows中都尝试过,只在windows上出现。我会查更多的。此外,点击后无法工作,这似乎是一个错误<代码>包含使用在发布事件后也返回false。你可能会发现一个棘手的问题,如下面回答的那样来解决这个问题。我无法使用Qt5.12.4在Windows上重现这个问题。因此,这似乎是一个回归错误。您考虑过创建一个吗?对于小型的MouseArea
s,这种方法似乎很难实现。如果我单击,然后移动鼠标,然后释放,然后再次移动鼠标,如果我太快,第二个onRelease
将不会触发。我的MouseArea
s是20 x 20像素。
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.');
}
}
}