diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/AndroidManifest.xml.tpl b/share/qtcreator/templates/wizards/projects/xrapplication/AndroidManifest.xml.tpl
new file mode 100644
index 00000000000..1e7a79098ad
--- /dev/null
+++ b/share/qtcreator/templates/wizards/projects/xrapplication/AndroidManifest.xml.tpl
@@ -0,0 +1,34 @@
+
+
+@if %{Hands}
+
+
+@endif
+@if %{Anchors}
+
+
+@endif
+
+@if %{Passthrough}
+
+@endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/CMakeLists.txt b/share/qtcreator/templates/wizards/projects/xrapplication/CMakeLists.txt
new file mode 100644
index 00000000000..aa476eb51bb
--- /dev/null
+++ b/share/qtcreator/templates/wizards/projects/xrapplication/CMakeLists.txt
@@ -0,0 +1,56 @@
+cmake_minimum_required(VERSION 3.16)
+
+project(%{ProjectName} VERSION 0.1 LANGUAGES CXX)
+
+set(CMAKE_AUTOMOC ON)
+
+find_package(Qt6 COMPONENTS Core Gui Quick Quick3D Quick3DXr)
+
+qt_standard_project_setup(REQUIRES 6.8)
+qt6_policy(SET QTP0002 NEW)
+
+qt_add_executable(${CMAKE_PROJECT_NAME}
+ MANUAL_FINALIZATION
+ main.cpp
+ android/AndroidManifest.xml
+)
+
+qt_add_qml_module(${CMAKE_PROJECT_NAME}
+ URI ${CMAKE_PROJECT_NAME}
+ VERSION 1.0
+ QML_FILES
+ Main.qml
+)
+
+if (APPLE AND CMAKE_SYSTEM_NAME STREQUAL "visionOS")
+ set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
+ MACOSX_BUNDLE_GUI_IDENTIFIER io.qt.${CMAKE_PROJECT_NAME}
+ MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/visionos/MacOSXBundleInfo.plist.in
+ )
+endif()
+
+target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE
+ Qt::Core
+ Qt::Gui
+ Qt::Quick
+ Qt::Quick3D
+ Qt::Quick3DXr
+)
+
+if(ANDROID)
+ set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
+ QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android"
+ QT_ANDROID_PACKAGE_NAME "org.qtproject.example.${CMAKE_PROJECT_NAME}"
+ QT_ANDROID_APP_NAME "${CMAKE_PROJECT_NAME}"
+ QT_ANDROID_TARGET_SDK_VERSION 32
+ QT_ANDROID_MIN_SDK_VERSION 32
+ QT_ANDROID_VERSION_NAME "1.0")
+endif()
+
+qt_finalize_executable(${CMAKE_PROJECT_NAME})
+install(TARGETS ${CMAKE_PROJECT_NAME}
+ BUNDLE DESTINATION .
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+)
+
diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/MacOSXBundleInfo.plist.in b/share/qtcreator/templates/wizards/projects/xrapplication/MacOSXBundleInfo.plist.in
new file mode 100644
index 00000000000..455041fde0c
--- /dev/null
+++ b/share/qtcreator/templates/wizards/projects/xrapplication/MacOSXBundleInfo.plist.in
@@ -0,0 +1,57 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ ${MACOSX_BUNDLE_EXECUTABLE_NAME}
+ CFBundleGetInfoString
+ ${MACOSX_BUNDLE_INFO_STRING}
+ CFBundleIconFile
+ ${MACOSX_BUNDLE_ICON_FILE}
+ CFBundleIdentifier
+ ${MACOSX_BUNDLE_GUI_IDENTIFIER}
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleLongVersionString
+ ${MACOSX_BUNDLE_LONG_VERSION_STRING}
+ CFBundleName
+ ${MACOSX_BUNDLE_BUNDLE_NAME}
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ ${MACOSX_BUNDLE_SHORT_VERSION_STRING}
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ ${MACOSX_BUNDLE_BUNDLE_VERSION}
+ CSResourcesFileMapped
+
+ NSHumanReadableCopyright
+ ${MACOSX_BUNDLE_COPYRIGHT}
+ NSHandsTrackingUsageDescription
+ Hand tracking needed for user input
+ NSWorldSensingUsageDescription
+ World sensing needed for anchoring and scene mapping
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+
+ UIApplicationPreferredDefaultSceneSessionRole
+ CPSceneSessionRoleImmersiveSpaceApplication
+ UISceneConfigurations
+
+ CPSceneSessionRoleImmersiveSpaceApplication
+
+
+ UISceneConfigurationName
+ ImmersiveApp
+
+
+
+
+
+
+
diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/Main.qml.tpl b/share/qtcreator/templates/wizards/projects/xrapplication/Main.qml.tpl
new file mode 100644
index 00000000000..f7d970d9f90
--- /dev/null
+++ b/share/qtcreator/templates/wizards/projects/xrapplication/Main.qml.tpl
@@ -0,0 +1,100 @@
+import QtQuick
+import QtQuick3D.Helpers
+import QtQuick3D
+import QtQuick3D.Xr
+
+XrView {
+ id: xrView
+
+@if %{Passthrough}
+ property bool preferPassthrough: true
+ passthroughEnabled: passthroughSupported && preferPassthrough
+@endif
+
+ environment: SceneEnvironment {
+ clearColor: "skyblue"
+@if %{Passthrough}
+ backgroundMode: xrView.passthroughEnabled ? SceneEnvironment.Transparent : SceneEnvironment.Color
+@else
+ backgroundMode: SceneEnvironment.Color
+@endif
+ }
+
+ xrOrigin: theOrigin
+ XrOrigin {
+ id: theOrigin
+
+ XrController {
+ controller: XrController.ControllerLeft
+ poseSpace: XrController.AimPose
+ Model {
+ source: "#Cube"
+ scale: Qt.vector3d(0.1, 0.1, 0.1)
+ materials: PrincipledMaterial {
+ lighting: DefaultMaterial.NoLighting
+ baseColor: "red"
+ }
+ }
+ }
+
+ XrController {
+ controller: XrController.ControllerRight
+ poseSpace: XrController.AimPose
+ Model {
+ source: "#Cube"
+ scale: Qt.vector3d(0.1, 0.1, 0.1)
+ materials: PrincipledMaterial {
+ lighting: DefaultMaterial.NoLighting
+ baseColor: "green"
+ }
+ }
+ }
+ }
+
+ DirectionalLight {
+ eulerRotation.x: -30
+ eulerRotation.y: -70
+ }
+
+ // The scene:
+ Model {
+ y: 100
+ z: -50
+ source: "#Cube"
+ scale: Qt.vector3d(0.2, 0.2, 0.2)
+ materials: PrincipledMaterial {
+ baseColor: "green"
+ }
+ eulerRotation.x: 30
+ PropertyAnimation on eulerRotation {
+ from: "30, 0, 0"
+ to: "30, 360, 0"
+ loops: -1
+ duration: 20000
+ }
+ }
+@if %{Anchors}
+ // Anchors:
+ Repeater3D {
+ id: spatialAnchors
+ model: XrSpatialAnchorListModel {
+ }
+ delegate: Node {
+ id: anchorNode
+ required property XrSpatialAnchor anchor
+ required property int index
+ position: anchor.position
+ rotation: anchor.rotation
+
+ Model {
+ // Visualize anchor orientation
+ materials: PrincipledMaterial { baseColor: "white" }
+ source: "#Cone"
+ scale: Qt.vector3d(0.2, 0.2, 0.2)
+ eulerRotation.x: 90
+ }
+ visible: anchor.has2DBounds || anchor.has3DBounds
+ }
+ }
+@endif
+}
diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/icon.png b/share/qtcreator/templates/wizards/projects/xrapplication/icon.png
new file mode 100644
index 00000000000..edaa2e663ca
Binary files /dev/null and b/share/qtcreator/templates/wizards/projects/xrapplication/icon.png differ
diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/icon@2x.png b/share/qtcreator/templates/wizards/projects/xrapplication/icon@2x.png
new file mode 100644
index 00000000000..a426357411a
Binary files /dev/null and b/share/qtcreator/templates/wizards/projects/xrapplication/icon@2x.png differ
diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/main.cpp b/share/qtcreator/templates/wizards/projects/xrapplication/main.cpp
new file mode 100644
index 00000000000..8b5f94f6a9a
--- /dev/null
+++ b/share/qtcreator/templates/wizards/projects/xrapplication/main.cpp
@@ -0,0 +1,15 @@
+%{Cpp:LicenseTemplate}\
+%{JS: QtSupport.qtIncludes([], ["QtGui/QGuiApplication", "QtQml/QQmlApplicationEngine"])}
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QQmlApplicationEngine engine;
+ QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
+ &app, []() { QCoreApplication::exit(-1); },
+ Qt::QueuedConnection);
+ engine.loadFromModule("%{JS: value('ProjectName')}", "Main");
+
+ return app.exec();
+}
diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/qtquickcontrols2.conf b/share/qtcreator/templates/wizards/projects/xrapplication/qtquickcontrols2.conf
new file mode 100644
index 00000000000..fd44f05995d
--- /dev/null
+++ b/share/qtcreator/templates/wizards/projects/xrapplication/qtquickcontrols2.conf
@@ -0,0 +1,25 @@
+; This file can be edited to change the style of the application
+; Read "Qt Quick Controls 2 Configuration File" for details:
+; https://doc.qt.io/qt/qtquickcontrols2-configuration.html
+@if '%{QtQuickControlsStyle}' != 'Default'
+
+[Controls]
+Style=%{QtQuickControlsStyle}
+@if '%{QtQuickControlsStyle}' == 'Universal'
+
+[Universal]
+Theme=%{QtQuickControlsStyleTheme}
+;Accent=Steel
+;Foreground=Brown
+;Background=Steel
+@endif
+@if '%{QtQuickControlsStyle}' == 'Material'
+
+[Material]
+Theme=%{QtQuickControlsStyleTheme}
+;Accent=BlueGrey
+;Primary=BlueGray
+;Foreground=Brown
+;Background=Grey
+@endif
+@endif
diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/wizard.json b/share/qtcreator/templates/wizards/projects/xrapplication/wizard.json
new file mode 100644
index 00000000000..90f5c609436
--- /dev/null
+++ b/share/qtcreator/templates/wizards/projects/xrapplication/wizard.json
@@ -0,0 +1,113 @@
+{
+ "version": 1,
+ "supportedProjectTypes": [ "CMakeProjectManager.CMakeProject" ],
+ "id": "U.QtQuickXRApplicationEmpty",
+ "category": "H.Project",
+ "trDescription": "Creates a Qt Quick 3D XR application with QML and C++ code. You can build and deploy the application to desktop VR and standalone XR platforms. For the Apple Vision Pro, you can develop in Qt Creator but must deploy the CMake project with XCode.",
+ "trDisplayName": "XR Application",
+ "trDisplayCategory": "Application (Qt)",
+ "icon": "icon.png",
+ "iconKind": "Themed",
+ "featuresRequired": [ "QtSupport.Wizards.FeatureQt.6.8" ],
+ "enabled": "%{JS: value('Plugins').indexOf('CMakeProjectManager') >= 0 }",
+
+ "options":
+ [
+ { "key": "ProjectFile", "value": "%{ProjectDirectory}/CMakeLists.txt" },
+ { "key": "MainCppFileName", "value": "%{JS: 'main.' + Util.preferredSuffix('text/x-c++src') }" },
+ { "key": "TargetName", "value": "%{JS: 'app' + value('ProjectName') }" }
+ ],
+
+ "pages":
+ [
+ {
+ "trDisplayName": "Project Location",
+ "trShortTitle": "Location",
+ "typeId": "Project"
+ },
+ {
+ "trDisplayName": "XR Features",
+ "trShortTitle": "Features",
+ "typeId": "Fields",
+ "data":
+ [
+ {
+ "name": "Passthrough",
+ "trDisplayName": "Request passthrough",
+ "type": "CheckBox",
+ "trToolTip": "Request permissions for passthrough mode.",
+ "data": {
+ "checked": true
+ }
+ },
+ {
+ "name": "Hands",
+ "trDisplayName": "Request hand tracking",
+ "type": "CheckBox",
+ "trToolTip": "Request permissions for hand tracking.",
+ "data": {
+ "checked": true
+ }
+ },
+ {
+ "name": "Anchors",
+ "trDisplayName": "Request spatial anchors",
+ "type": "CheckBox",
+ "trToolTip": "Request permissions for anchors API.",
+ "data": {
+ "checked": true
+ }
+ }
+ ]
+ },
+ {
+ "trDisplayName": "Kit Selection: For Apple Vision Pro, select any kit.",
+ "trShortTitle": "Kits",
+ "typeId": "Kits",
+ "enabled": "%{JS: !value('IsSubproject')}",
+ "data": {
+ "projectFilePath": "%{ProjectFile}"
+ }
+ },
+ {
+ "trDisplayName": "Project Management",
+ "trShortTitle": "Summary",
+ "typeId": "Summary"
+ }
+ ],
+ "generators":
+ [
+ {
+ "typeId": "File",
+ "data":
+ [
+ {
+ "source": "CMakeLists.txt",
+ "openAsProject": true
+ },
+ {
+ "source": "main.cpp",
+ "target": "%{MainCppFileName}"
+ },
+ {
+ "source": "Main.qml.tpl",
+ "target": "Main.qml",
+ "openInEditor": true
+ },
+ {
+ "source": "../git.ignore",
+ "target": ".gitignore",
+ "condition": "%{JS: !value('IsSubproject') && value('VersionControl') === 'G.Git' }"
+ },
+ {
+ "source": "AndroidManifest.xml.tpl",
+ "target": "android/AndroidManifest.xml"
+ },
+ {
+ "source": "MacOSXBundleInfo.plist.in",
+ "target": "visionos/MacOSXBundleInfo.plist.in"
+ }
+ ]
+ }
+ ]
+}