QML MouseArea:以编程方式将鼠标移至MouseArea

问题描述

此问题在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.');
        }
    }
}

重现此问题的步骤:

  1. 将鼠标放在窗口上。光标将移动到屏幕的左上角,并且onExited将触发。
  2. 释放鼠标按钮。光标将跳到窗口的中间。
  3. 将鼠标移出窗口。
当用户将鼠标移出窗口时,

onExited应该会再次触发,但不会。有什么办法可以我

  1. 引起火灾,或
  2. 是否检测到鼠标已移出鼠标区域?

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 (将#修改为@)