微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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并使用。

解决方法

作为解决问题的方法,您可以使用计时器重置鼠标光标的位置。

在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); });
}

如果计时器的间隔不太短,这对我有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?