main.qml Example File | Qt Data Visualization 5.9

Qt 5.9 | Qt Data Visualization | Qt Quick 2 Custom Input Example | main.qml Example File

Qt 5.9.3 Reference Documentation

# main.qml Example File

qmlcustominput/qml/qmlcustominput/main.qml

      /****************************************************************************
      **
      ** Copyright (C) 2016 The Qt Company Ltd.
      ** Contact: https://www.qt.io/licensing/
      **
      ** This file is part of the Qt Data Visualization module of the Qt Toolkit.
      **
      ** $QT_BEGIN_LICENSE:GPL$
      ** 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 General Public License Usage
      ** Alternatively, this file may be used under the terms of the GNU
      ** General Public License version 3 or (at your option) any later version
      ** approved by the KDE Free Qt Foundation. The licenses are as published by
      ** the Free Software Foundation and appearing in the file LICENSE.GPL3
      ** included in the packaging of this file. Please review the following
      ** information to ensure the GNU General Public License requirements will
      ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
      **
      ** $QT_END_LICENSE$
      **
      ****************************************************************************/

      import QtQuick 2.1
      import QtQuick.Layouts 1.0
      import QtDataVisualization 1.0
      import "."

      Rectangle {
          id: mainView
          width: 1280
          height: 720

          Data {
              id: graphData
          }

          Item {
              id: dataView
              anchors.bottom: parent.bottom
              width: parent.width
              height: parent.height - buttonLayout.height

              Scatter3D {
                  id: scatterGraph
                  width: dataView.width
                  height: dataView.height
                  theme: Theme3D { type: Theme3D.ThemeDigia }
                  shadowQuality: AbstractGraph3D.ShadowQualityMedium
                  scene.activeCamera.yRotation: 30.0
                  inputHandler: null

                  Scatter3DSeries {
                      id: scatterSeriesOne
                      itemLabelFormat: "One - X:@xLabel Y:@yLabel Z:@zLabel"
                      mesh: Abstract3DSeries.MeshCube

                      ItemModelScatterDataProxy {
                          itemModel: graphData.modelOne
                          xPosRole: "xPos"
                          yPosRole: "yPos"
                          zPosRole: "zPos"
                      }
                  }

                  Scatter3DSeries {
                      id: scatterSeriesTwo
                      itemLabelFormat: "Two - X:@xLabel Y:@yLabel Z:@zLabel"
                      mesh: Abstract3DSeries.MeshCube

                      ItemModelScatterDataProxy {
                          itemModel: graphData.modelTwo
                          xPosRole: "xPos"
                          yPosRole: "yPos"
                          zPosRole: "zPos"
                      }
                  }

                  Scatter3DSeries {
                      id: scatterSeriesThree
                      itemLabelFormat: "Three - X:@xLabel Y:@yLabel Z:@zLabel"
                      mesh: Abstract3DSeries.MeshCube

                      ItemModelScatterDataProxy {
                          itemModel: graphData.modelThree
                          xPosRole: "xPos"
                          yPosRole: "yPos"
                          zPosRole: "zPos"
                      }
                  }
              }

              MouseArea {
                  id: inputArea
                  anchors.fill: parent
                  hoverEnabled: true
                  acceptedButtons: Qt.LeftButton | Qt.RightButton
                  property int mouseX: -1
                  property int mouseY: -1

                  onPositionChanged: {
                      mouseX = mouse.x;
                      mouseY = mouse.y;
                  }

                  onWheel: {
                      // Adjust zoom level based on what zoom range we're in.
                      var zoomLevel = scatterGraph.scene.activeCamera.zoomLevel;
                      if (zoomLevel > 100)
                          zoomLevel += wheel.angleDelta.y / 12.0;
                      else if (zoomLevel > 50)
                          zoomLevel += wheel.angleDelta.y / 60.0;
                      else
                          zoomLevel += wheel.angleDelta.y / 120.0;
                      if (zoomLevel > 500)
                          zoomLevel = 500;
                      else if (zoomLevel < 10)
                          zoomLevel = 10;

                      scatterGraph.scene.activeCamera.zoomLevel = zoomLevel;
                  }
              }

              Timer {
                  id: reselectTimer
                  interval: 10
                  running: true
                  repeat: true
                  onTriggered: {
                      scatterGraph.scene.selectionQueryPosition = Qt.point(inputArea.mouseX, inputArea.mouseY);
                  }
              }
          }

          NumberAnimation {
              id: cameraAnimationX
              loops: Animation.Infinite
              running: true
              target: scatterGraph.scene.activeCamera
              property:"xRotation"
              from: 0.0
              to: 360.0
              duration: 20000
          }

          SequentialAnimation {
              id: cameraAnimationY
              loops: Animation.Infinite
              running: true

              NumberAnimation {
                  target: scatterGraph.scene.activeCamera
                  property:"yRotation"
                  from: 5.0
                  to: 45.0
                  duration: 9000
                  easing.type: Easing.InOutSine
              }

              NumberAnimation {
                  target: scatterGraph.scene.activeCamera
                  property:"yRotation"
                  from: 45.0
                  to: 5.0
                  duration: 9000
                  easing.type: Easing.InOutSine
              }
          }

          RowLayout {
              id: buttonLayout
              Layout.minimumHeight: shadowToggle.height
              width: parent.width
              anchors.left: parent.left
              spacing: 0

              NewButton {
                  id: shadowToggle
                  Layout.fillHeight: true
                  Layout.minimumWidth: parent.width / 3 // 3 buttons divided equally in the layout
                  text: scatterGraph.shadowsSupported ? "Hide Shadows" : "Shadows not supported"
                  enabled: scatterGraph.shadowsSupported

                  onClicked: {
                      if (scatterGraph.shadowQuality === AbstractGraph3D.ShadowQualityNone) {
                          scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityMedium;
                          text = "Hide Shadows";
                      } else {
                          scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityNone;
                          text = "Show Shadows";
                      }
                  }
              }

              NewButton {
                  id: cameraToggle
                  Layout.fillHeight: true
                  Layout.minimumWidth: parent.width / 3
                  text: "Pause Camera"

                  onClicked: {
                      cameraAnimationX.paused = !cameraAnimationX.paused;
                      cameraAnimationY.paused = cameraAnimationX.paused;
                      if (cameraAnimationX.paused) {
                          text = "Animate Camera";
                      } else {
                          text = "Pause Camera";
                      }
                  }
              }

              NewButton {
                  id: exitButton
                  Layout.fillHeight: true
                  Layout.minimumWidth: parent.width / 3
                  text: "Quit"
                  onClicked: Qt.quit(0);
              }
          }
      }