Qt QML MouseArea:onexitted不';以编程方式将鼠标移动到MouseArea后,将不会触发

Qt QML MouseArea:onexitted不';以编程方式将鼠标移动到MouseArea后,将不会触发,qt,qml,mousearea,Qt,Qml,Mousearea,此问题在Windows上发生,但在Linux上不发生。我没有尝试过其他平台 我有一个自定义类(下面的代码),它使用QCursor设置鼠标位置 问题在于以下代码(): 重现问题的步骤: 把鼠标放在窗户上。光标将移动到屏幕的左上角,并触发onExited 松开鼠标按钮。光标将跳到窗口的中间 将鼠标移出窗口 当用户将鼠标移出窗口时,onExited应再次启动,但不会启动。有什么办法我也可以吗 使其着火,或 否则,是否检测到鼠标已移出鼠标区域 onPositionChanged仍会激发,但我只能用它来检

此问题在Windows上发生,但在Linux上不发生。我没有尝试过其他平台

我有一个自定义类(下面的代码),它使用
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.');
            }
        }
    }