В настоящее время я работаю над проектом виртуальной реальности, который основывается на OpenGL. Поскольку мне также нужен какой-то пользовательский интерфейс, я подумал, что было бы неплохо интегрировать окна QtQuick в сцену. Рисование окна текстуры работает без проблем (я использовал this example), но я изо всех сил пытаюсь отправить события мыши, чтобы мои контроллеры могли взаимодействовать с ним.Отправка событий мыши в окно QtQuick в виртуальной реальности. OpenGL scene
Here is a quick example video on YouTube. В этом примере анимация встроенного GIF должна останавливаться всякий раз, когда я навис над ним. Это работает в обычном приложении QML, но не тогда, когда я вручную отправляю событие MouseMove. положение мыши в окне, как известно (красная линия на видео указывает на пересечение) и я в настоящее время отправки события через
QQuickWindow::sendEvent(QQuickItem* item, QEvent*)
где элемент является корнем Прямоугольник в источнике QML:
import QtQuick 2.3
import QtQuick.Controls 2.0
Rectangle {
color: mouseArea.containsMouse ? "red" : "white"
width: 600
height: 400
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
AnimatedImage {
anchors.fill: parent
paused: mouseArea.containsMouse
source: "test.gif"
}
}
}
событие, которое я посылаю каждый раз, когда пересечение между лучом и окна найден, выполняется с:
QMouseEvent* mouseMoveEvent = new QMouseEvent(
QEvent::MouseMove, // wrong event?
cursorPosition, cursorPosition, // Note: cursorPosition := the calculated cursor coordinates within the window
Qt::MouseButton::NoButton,
Qt::MouseButtons(), // is this right?
Qt::KeyboardModifier::NoModifier);
window->sendEvent(rootItem, mouseMoveEvent); // Note: window is my QQuickWindow, rootItem is the root Rectangle
Я не эксперт в QML (редко использовал его) и был бы признателен, если у кого-то есть предложения по тому, как это решить. Я предполагаю, что я не использую правильное событие и не правильно их отправляю.
Как вы управляете событием мыши? вы проверили, распространяется ли событие в первую очередь? Проверьте http://doc.qt.io/qt-5/qwidget.html#mouseTracking-prop. – Harish
Я не использую QWidget, и мой вопрос состоял в создании моих собственных событий (всякий раз, когда я проверяю пересечения между лучом от моего контроллера и окном), которое затем отправляю в свое окно. Решением было использование QApplication :: instance() -> sendEvent (..) вместо QQuickWindow :: sendEvent (..). – seryogah