From dd20abe1d1be97bf5e9939b4e642120ef68ed439 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 4 Apr 2017 11:49:21 +0200 Subject: Add a QQuickWidget-based Scene3D example Shares the QML files with the scene3d example. Task-number: QTBUG-52132 Change-Id: I076284b66a8dfdc3308171f11528851a7e20bbce Reviewed-by: Sean Harmer --- examples/qt3d/qt3d.pro | 5 +- .../widgets-scene3d/doc/images/widgets-scene3d.png | Bin 0 -> 18001 bytes .../widgets-scene3d/doc/src/widgets-scene3d.qdoc | 56 +++++++++++++++ examples/qt3d/widgets-scene3d/main.cpp | 76 +++++++++++++++++++++ examples/qt3d/widgets-scene3d/widgets-scene3d.pro | 15 ++++ examples/qt3d/widgets-scene3d/widgets-scene3d.qrc | 6 ++ 6 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 examples/qt3d/widgets-scene3d/doc/images/widgets-scene3d.png create mode 100644 examples/qt3d/widgets-scene3d/doc/src/widgets-scene3d.qdoc create mode 100644 examples/qt3d/widgets-scene3d/main.cpp create mode 100644 examples/qt3d/widgets-scene3d/widgets-scene3d.pro create mode 100644 examples/qt3d/widgets-scene3d/widgets-scene3d.qrc diff --git a/examples/qt3d/qt3d.pro b/examples/qt3d/qt3d.pro index a64624352..dc5ba5a7e 100644 --- a/examples/qt3d/qt3d.pro +++ b/examples/qt3d/qt3d.pro @@ -29,7 +29,10 @@ qtHaveModule(multimedia): SUBDIRS += audio-visualizer-qml # TODO Port the old examples to new APIs #SUBDIRS += qt3d -qtHaveModule(widgets): SUBDIRS += basicshapes-cpp +qtHaveModule(widgets) { + SUBDIRS += basicshapes-cpp + qtHaveModule(quickwidgets): SUBDIRS += widgets-scene3d +} EXAMPLE_FILES += \ exampleresources diff --git a/examples/qt3d/widgets-scene3d/doc/images/widgets-scene3d.png b/examples/qt3d/widgets-scene3d/doc/images/widgets-scene3d.png new file mode 100644 index 000000000..ead570013 Binary files /dev/null and b/examples/qt3d/widgets-scene3d/doc/images/widgets-scene3d.png differ diff --git a/examples/qt3d/widgets-scene3d/doc/src/widgets-scene3d.qdoc b/examples/qt3d/widgets-scene3d/doc/src/widgets-scene3d.qdoc new file mode 100644 index 000000000..267b53ba8 --- /dev/null +++ b/examples/qt3d/widgets-scene3d/doc/src/widgets-scene3d.qdoc @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \example widgets-scene3d + \title Qt 3D: Scene3D QML with Widgets Example + \ingroup qt3d-examples-qml + \brief A QWidget-based application with a QML scene containing a 3D scene. + + \image widgets-scene3d.png + + \e {widgets-scene3D} demonstrates visualizing a 3D scene from a + QWidget-based application using QQuickWidget. + + The actual 3D scene is the same as in the \e {scene3d} example. + + This approach is different from the one based on + QWidget::createWindowContainer() demonstrated in \e {basicshapes-cpp} + because it does not create a native window for the Qt 3D content. Rather, + it uses QQuickWidget, a genuine QWidget subclass to compose the Qt Quick + and Qt 3D content together with the traditional widgets. + + \note Be aware of the performance implications. While this approach is very + flexible in the sense that it allows mixing QML and Qt 3D with widgets + without clipping or stacking issues, using Scene3D in a QQuickWidget + involves rendering to offscreen render targets (via framebuffer objects) + twice. This is not always desirable for more complex scenes. For those the + native window based approach shown in \e {basicshapes-cpp} will likely be a + better choice. + + \include examples-run.qdocinc +*/ diff --git a/examples/qt3d/widgets-scene3d/main.cpp b/examples/qt3d/widgets-scene3d/main.cpp new file mode 100644 index 000000000..593863cff --- /dev/null +++ b/examples/qt3d/widgets-scene3d/main.cpp @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + + QMainWindow mainWindow; + + QMdiArea *centralWidget = new QMdiArea; + + QLCDNumber *lcd = new QLCDNumber; + lcd->display(1337); + lcd->setMinimumSize(250, 100); + centralWidget->addSubWindow(lcd); + + QQuickWidget *quickWidget = new QQuickWidget; + quickWidget->setMinimumSize(300, 300); + quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); + quickWidget->setSource(QUrl("qrc:/main.qml")); + centralWidget->addSubWindow(quickWidget); + + mainWindow.setCentralWidget(centralWidget); + + QMenu *fileMenu = mainWindow.menuBar()->addMenu(QObject::tr("&File")); + fileMenu->addAction(QObject::tr("E&xit"), qApp, &QCoreApplication::quit); + + mainWindow.resize(800, 600); + mainWindow.show(); + + return app.exec(); +} diff --git a/examples/qt3d/widgets-scene3d/widgets-scene3d.pro b/examples/qt3d/widgets-scene3d/widgets-scene3d.pro new file mode 100644 index 000000000..5c11db360 --- /dev/null +++ b/examples/qt3d/widgets-scene3d/widgets-scene3d.pro @@ -0,0 +1,15 @@ +!include( ../examples.pri ) { + error( "Couldn't find the examples.pri file!" ) +} + +QT += widgets qml quick quickwidgets 3dinput + +SOURCES += \ + main.cpp + +OTHER_FILES += \ + ../scene3d/AnimatedEntity.qml \ + ../scene3d/main.qml + +RESOURCES += \ + widgets-scene3d.qrc diff --git a/examples/qt3d/widgets-scene3d/widgets-scene3d.qrc b/examples/qt3d/widgets-scene3d/widgets-scene3d.qrc new file mode 100644 index 000000000..ce824b054 --- /dev/null +++ b/examples/qt3d/widgets-scene3d/widgets-scene3d.qrc @@ -0,0 +1,6 @@ + + + ../scene3d/AnimatedEntity.qml + ../scene3d/main.qml + + -- cgit v1.2.3