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
qquick3dxrvirtualmouse.cpp
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
5#include "qquick3dxrview_p.h"
6
7#include <QtQuick3D/private/qquick3dnode_p.h>
8#include <QtGui/QMouseEvent>
9
11
23
24
33{
34 return m_rightMouseButton;
35}
36
45{
46 return m_leftMouseButton;
47}
48
57{
58 return m_middleMouseButton;
59}
60
68{
69 return m_source;
70}
71
79{
80 return m_view;
81}
82
90{
91 return m_enabled;
92}
93
95{
96 if (m_rightMouseButton == rightMouseButton)
97 return;
98
99 m_rightMouseButton = rightMouseButton;
100 emit rightMouseButtonChanged(m_rightMouseButton);
101 if (m_rightMouseButton) {
102 // Press
104 } else {
105 // Release
107 }
108}
109
111{
112 if (m_leftMouseButton == leftMouseButton)
113 return;
114
115 m_leftMouseButton = leftMouseButton;
116 emit leftMouseButtonChanged(m_leftMouseButton);
117 if (m_leftMouseButton) {
118 // Press
120 } else {
121 // Release
123 }
124}
125
127{
128 if (m_middleMouseButton == middleMouseButton)
129 return;
130
131 m_middleMouseButton = middleMouseButton;
132 emit middleMouseButtonChanged(m_middleMouseButton);
133 if (m_middleMouseButton) {
134 // Press
136 } else {
137 // Release
139 }
140}
141
143{
144 if (m_source == source)
145 return;
146
147 if (!source)
148 disconnect(m_source, &QQuick3DNode::sceneTransformChanged, this, &QQuick3DXrVirtualMouse::moveEvent);
149
150 m_source = source;
151 emit sourceChanged(m_source);
152
153 if (m_source)
154 connect(m_source, &QQuick3DNode::sceneTransformChanged, this, &QQuick3DXrVirtualMouse::moveEvent);
155
156}
157
159{
160 if (m_view == view)
161 return;
162
163 m_view = view;
164 emit viewChanged(m_view);
165}
166
168{
169 if (m_enabled == enabled)
170 return;
171 m_enabled = enabled;
172 emit enabledChanged(m_enabled);
173
174 // Generate mouse release event if we disable when pressed
175 if (!m_enabled && (m_leftMouseButton || m_rightMouseButton || m_middleMouseButton)) {
176 Qt::MouseButton button = m_leftMouseButton ? Qt::LeftButton : m_rightMouseButton ? Qt::RightButton : Qt::MiddleButton;
177 m_leftMouseButton = m_rightMouseButton = m_middleMouseButton = false;
178 generateEvent(QEvent::MouseButtonRelease, button);
179 }
180}
181
182void QQuick3DXrVirtualMouse::moveEvent()
183{
184 generateEvent(QEvent::MouseMove, Qt::NoButton);
185}
186
187void QQuick3DXrVirtualMouse::generateEvent(QEvent::Type type, Qt::MouseButton button)
188{
189 if (!m_view || !m_source || m_view->m_inDestructor || !m_enabled)
190 return;
191
192 // Get Ray
193 const QVector3D origin = m_source->scenePosition();
194 const QVector3D direction = m_source->forward();
195
196 // Generate Pointer Event
197 Qt::MouseButtons buttons = Qt::NoButton;
198 if (m_leftMouseButton)
199 buttons |= Qt::LeftButton;
200 if (m_rightMouseButton)
201 buttons |= Qt::RightButton;
202 if (m_middleMouseButton)
203 buttons |= Qt::MiddleButton;
204
205 // Position will be generated by QtQuick3D
206 QMouseEvent *event = new QMouseEvent(type, QPointF(), QPointF(), button, buttons, Qt::NoModifier);
207
208 // Send to View with Ray
209 if (m_view->view3d()) // no internal view3D if XrView init failed but the object is still alive, handle this gracefully
210 m_view->view3d()->singlePointPick(event, origin, direction);
211
212 // Cleanup
213 delete event;
214}
215
216
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
\inmodule QtCore\reentrant
Definition qpoint.h:217
QVector3D scenePosition
QVector3D forward
void sceneTransformChanged()
bool singlePointPick(QSinglePointEvent *event, const QVector3D &origin, const QVector3D &direction)
void setRightMouseButton(bool rightMouseButton)
void enabledChanged(bool enabled)
void sourceChanged(QQuick3DNode *source)
void setView(QQuick3DXrView *view)
void viewChanged(QQuick3DXrView *view)
void rightMouseButtonChanged(bool rightMouseButton)
void leftMouseButtonChanged(bool leftMouseButton)
void middleMouseButtonChanged(bool middleMouseButton)
void setMiddleMouseButton(bool middleMouseButton)
void setSource(QQuick3DNode *source)
QQuick3DXrVirtualMouse(QObject *parent=nullptr)
\qmltype XrVirtualMouse \inherits Item \inqmlmodule QtQuick3D.Xr
void setLeftMouseButton(bool leftMouseButton)
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]