2016-12-30 11 views
2

В настоящее время я работаю над проектом виртуальной реальности, который основывается на 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 (редко использовал его) и был бы признателен, если у кого-то есть предложения по тому, как это решить. Я предполагаю, что я не использую правильное событие и не правильно их отправляю.

+0

Как вы управляете событием мыши? вы проверили, распространяется ли событие в первую очередь? Проверьте http://doc.qt.io/qt-5/qwidget.html#mouseTracking-prop. – Harish

+0

Я не использую QWidget, и мой вопрос состоял в создании моих собственных событий (всякий раз, когда я проверяю пересечения между лучом от моего контроллера и окном), которое затем отправляю в свое окно. Решением было использование QApplication :: instance() -> sendEvent (..) вместо QQuickWindow :: sendEvent (..). – seryogah

ответ

0

Я нашел решение самостоятельно. Вместо использования QQuickWindow :: sendEvent (..) мне пришлось просто использовать QApplication() :: instance() -> sendEvent (..).

+0

Довольно уверен, что вы также можете использовать последний метод, пока событие распространяется на обработчик. – Harish

+0

Что работало для меня, было использование 'QCoreApplication :: sendEvent (quick_window, event);'. –