Эта проблема возникает в 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, 0, "MouseHelper");
}
Затем я могу импортировать его в QML и использовать.
area2
. Проблема в том, что у меня нет способа определить, когда пользователь перемещает мышь изarea2
, потому что событиеonExited
срабатывает только в том случае, если пользователь перемещает мышь вarea2
, как обычно - я думаю, что перемещение ее программно не считается, и поэтому оно не знает, как отслеживатьonExited
?. - person Joshua Wade   schedule 24.08.2020area1
, 2) переместите мышь изarea2
.onExited
должен срабатывать наarea2
, но не срабатывает. - person Joshua Wade   schedule 24.08.2020mouseHelper.setCursorPosition(area2.x + area2.width * 0.5, area2.height * 0.5);
наvar p = area2.mapToGlobal(area2.width * .5, area2.height * 0.5) mouseHelper.setCursorPosition(p.x, p.y);
, поскольку QCursor использует глобальные позиции. - person eyllanesc   schedule 24.08.2020containsMouse
также возвращает false после выпущенного события. Возможно, вы можете найти хитрость, как ответили ниже, чтобы решить эту проблему. - person Yunus Temurlenk   schedule 27.08.20205.15.0
и не подумал проверить регрессии. Скоро сделаю отчет. - person Joshua Wade   schedule 28.08.2020