Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qopenxrvirtualmouse.cpp
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
5#include "qopenxrview_p.h"
6
7#include <QtQuick3D/private/qquick3dnode_p.h>
8#include <QtGui/QMouseEvent>
9
11
16
18{
19 return m_rightMouseButton;
20}
21
23{
24 return m_leftMouseButton;
25}
26
28{
29 return m_middleMouseButton;
30}
31
33{
34 return m_source;
35}
36
38{
39 return m_view;
40}
41
43{
44 return m_enabled;
45}
46
48{
49 if (m_rightMouseButton == rightMouseButton)
50 return;
51
52 m_rightMouseButton = rightMouseButton;
53 emit rightMouseButtonChanged(m_rightMouseButton);
54 if (m_rightMouseButton) {
55 // Press
57 } else {
58 // Release
60 }
61}
62
64{
65 if (m_leftMouseButton == leftMouseButton)
66 return;
67
68 m_leftMouseButton = leftMouseButton;
69 emit leftMouseButtonChanged(m_leftMouseButton);
70 if (m_leftMouseButton) {
71 // Press
73 } else {
74 // Release
76 }
77}
78
80{
81 if (m_middleMouseButton == middleMouseButton)
82 return;
83
84 m_middleMouseButton = middleMouseButton;
85 emit middleMouseButtonChanged(m_middleMouseButton);
86 if (m_middleMouseButton) {
87 // Press
89 } else {
90 // Release
92 }
93}
94
96{
97 if (m_source == source)
98 return;
99
100 if (!source)
101 disconnect(m_source, &QQuick3DNode::sceneTransformChanged, this, &QOpenXRVirtualMouse::moveEvent);
102
103 m_source = source;
104 emit sourceChanged(m_source);
105
106 if (m_source)
107 connect(m_source, &QQuick3DNode::sceneTransformChanged, this, &QOpenXRVirtualMouse::moveEvent);
108
109}
110
112{
113 if (m_view == view)
114 return;
115
116 m_view = view;
117 emit viewChanged(m_view);
118}
119
121{
122 if (m_enabled == enabled)
123 return;
124 m_enabled = enabled;
125 emit enabledChanged(m_enabled);
126
127 // Generate mouse release event if we disable when pressed
128 if (!m_enabled && (m_leftMouseButton || m_rightMouseButton || m_middleMouseButton)) {
129 Qt::MouseButton button = m_leftMouseButton ? Qt::LeftButton : m_rightMouseButton ? Qt::RightButton : Qt::MiddleButton;
130 m_leftMouseButton = m_rightMouseButton = m_middleMouseButton = false;
131 generateEvent(QEvent::MouseButtonRelease, button);
132 }
133}
134
135void QOpenXRVirtualMouse::moveEvent()
136{
137 generateEvent(QEvent::MouseMove, Qt::NoButton);
138}
139
140void QOpenXRVirtualMouse::generateEvent(QEvent::Type type, Qt::MouseButton button)
141{
142 if (!m_view || !m_source || m_view->m_inDestructor || !m_enabled)
143 return;
144
145 // Get Ray
146 const QVector3D origin = m_source->scenePosition();
147 const QVector3D direction = m_source->forward();
148
149 // Generate Pointer Event
150 Qt::MouseButtons buttons = Qt::NoButton;
151 if (m_leftMouseButton)
152 buttons |= Qt::LeftButton;
153 if (m_rightMouseButton)
154 buttons |= Qt::RightButton;
155 if (m_middleMouseButton)
156 buttons |= Qt::MiddleButton;
157
158 // Position will be generated by QtQuick3D
159 QMouseEvent *event = new QMouseEvent(type, QPointF(), QPointF(), button, buttons, Qt::NoModifier);
160
161 // Send to View with Ray
162 if (m_view->view3d()) // no internal view3D if XrView init failed but the object is still alive, handle this gracefully
163 m_view->view3d()->processPointerEventFromRay(origin, direction, event);
164
165 // Cleanup
166 delete event;
167}
168
Type
This enum type defines the valid event types in Qt.
Definition qcoreevent.h:51
@ MouseMove
Definition qcoreevent.h:63
@ MouseButtonPress
Definition qcoreevent.h:60
@ MouseButtonRelease
Definition qcoreevent.h:61
\inmodule QtGui
Definition qevent.h:196
\inmodule QtCore
Definition qobject.h:103
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
void setMiddleMouseButton(bool middleMouseButton)
void setEnabled(bool enabled)
void setLeftMouseButton(bool leftMouseButton)
QOpenXRVirtualMouse(QObject *parent=nullptr)
void rightMouseButtonChanged(bool rightMouseButton)
void sourceChanged(QQuick3DNode *source)
void setRightMouseButton(bool rightMouseButton)
void middleMouseButtonChanged(bool middleMouseButton)
void viewChanged(QOpenXRView *view)
void setSource(QQuick3DNode *source)
void leftMouseButtonChanged(bool leftMouseButton)
void enabledChanged(bool enabled)
void setView(QOpenXRView *view)
\inmodule QtCore\reentrant
Definition qpoint.h:217
QVector3D scenePosition
QVector3D forward
void sceneTransformChanged()
void processPointerEventFromRay(const QVector3D &origin, const QVector3D &direction, QPointerEvent *event)
The QVector3D class represents a vector or vertex in 3D space.
Definition qvectornd.h:171
QPushButton * button
[2]
direction
Combined button and popup list for selecting options.
MouseButton
Definition qnamespace.h:56
@ LeftButton
Definition qnamespace.h:58
@ RightButton
Definition qnamespace.h:59
@ MiddleButton
Definition qnamespace.h:60
@ NoButton
Definition qnamespace.h:57
@ NoModifier
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLenum type
GLsizei GLsizei GLchar * source
struct _cl_event * event
#define emit
myObject disconnect()
[26]
QQuickView * view
[0]