В настоящее время я работаю над проектом виртуальной реальности, основанным на OpenGL. Поскольку мне также требовалась некоторая форма пользовательского интерфейса, я подумал, что было бы неплохо интегрировать окна QtQuick в сцену. Рисование окна на текстуру работает без проблем (я использовал этот пример) но я изо всех сил пытаюсь отправить события мыши, чтобы мои контроллеры могли взаимодействовать с ним.
Вот небольшой пример видео на 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 (редко использую его) и был бы признателен, если у кого-то есть предложения о том, как решить эту проблему. Я предполагаю, что я не использую правильные события и не отправляю их правильно.
Я нашел решение сам. Вместо использования QQuickWindow :: sendEvent (..) мне пришлось просто использовать QApplication () :: instance () -> sendEvent (..).
Других решений пока нет …