main.qml Example File
qmloscilloscope/qml/qmloscilloscope/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 QtQuick.Controls 1.0
import QtDataVisualization 1.1
import "."
Item {
id : mainView
width : 1280
height : 1024
property int sampleColumns : sampleSlider .value
property int sampleRows : sampleColumns / 2
property int sampleCache : 24
onSampleRowsChanged : {
surfaceSeries .selectedPoint = surfaceSeries .invalidSelectionPosition
generateData ()
}
Item {
id : dataView
anchors .bottom: parent .bottom
width : parent .width
height : parent .height - buttonLayout .height
Surface3D {
id : surfaceGraph
width : dataView .width
height : dataView .height
shadowQuality : AbstractGraph3D .ShadowQualityNone
selectionMode : AbstractGraph3D .SelectionSlice | AbstractGraph3D .SelectionItemAndRow
renderingMode : AbstractGraph3D .RenderDirectToBackground
axisX .labelFormat: "%d ms"
axisY .labelFormat: "%d W"
axisZ .labelFormat: "%d mV"
axisX .min: 0
axisY .min: 0
axisZ .min: 0
axisX .max: 1000
axisY .max: 100
axisZ .max: 800
axisX .segmentCount: 4
axisY .segmentCount: 4
axisZ .segmentCount: 4
measureFps : true
onCurrentFpsChanged : {
if (fps > 10 )
fpsText .text = "FPS: " + Math .round (surfaceGraph .currentFps )
else
fpsText .text = "FPS: " + Math .round (surfaceGraph .currentFps * 10.0 ) / 10.0
}
Surface3DSeries {
id : surfaceSeries
drawMode : Surface3DSeries .DrawSurface ;
flatShadingEnabled : false ;
meshSmooth : true
itemLabelFormat : "@xLabel, @zLabel: @yLabel"
itemLabelVisible : false
onItemLabelChanged : {
if (surfaceSeries .selectedPoint === surfaceSeries .invalidSelectionPosition )
selectionText .text = "No selection"
else
selectionText .text = surfaceSeries .itemLabel
}
}
Component .onCompleted: mainView .generateData ()
}
}
Timer {
id : refreshTimer
interval : 1000 / frequencySlider .value
running : true
repeat : true
onTriggered : dataSource .update (surfaceSeries )
}
Rectangle {
width : parent .width
height : flatShadingToggle .height * 2
anchors .left: parent .left
anchors .top: parent .top
color : surfaceGraph .theme .backgroundColor
ColumnLayout {
anchors .fill: parent
RowLayout {
id : sliderLayout
anchors .top: parent .top
Layout .fillHeight: true
Layout .fillWidth: true
Layout .minimumHeight: flatShadingToggle .height
spacing : 0
Rectangle {
Layout .fillHeight: true
Layout .fillWidth: true
Layout .minimumWidth: samplesText .implicitWidth + 120
Layout .maximumWidth: samplesText .implicitWidth + 120
Layout .alignment: Qt .AlignHCenter | Qt .AlignVCenter
border .color: "gray"
border .width: 1
radius : 4
RowLayout {
anchors .fill: parent
anchors .margins: parent .border .width + 1
Slider {
id : sampleSlider
Layout .fillHeight: true
Layout .fillWidth: true
Layout .alignment: Qt .AlignHCenter | Qt .AlignVCenter
Layout .minimumWidth: 80
minimumValue : mainView .sampleCache * 2
maximumValue : minimumValue * 10
stepSize : mainView .sampleCache
updateValueWhileDragging : false
Component .onCompleted: value = minimumValue * 2
}
Rectangle {
Layout .fillHeight: true
Layout .fillWidth: true
Layout .minimumWidth: samplesText .implicitWidth + 10
Layout .maximumWidth: samplesText .implicitWidth + 10
Layout .alignment: Qt .AlignHCenter | Qt .AlignVCenter
Text {
id : samplesText
text : "Samples: " + (mainView .sampleRows * mainView .sampleColumns )
anchors .fill: parent
verticalAlignment : Text .AlignVCenter
horizontalAlignment : Text .AlignHCenter
}
}
}
}
Rectangle {
Layout .fillHeight: true
Layout .fillWidth: true
Layout .minimumWidth: frequencyText .implicitWidth + 120
Layout .maximumWidth: frequencyText .implicitWidth + 120
Layout .alignment: Qt .AlignHCenter | Qt .AlignVCenter
border .color: "gray"
border .width: 1
radius : 4
RowLayout {
anchors .fill: parent
anchors .margins: parent .border .width + 1
Slider {
id : frequencySlider
Layout .fillHeight: true
Layout .fillWidth: true
Layout .alignment: Qt .AlignHCenter | Qt .AlignVCenter
Layout .minimumWidth: 80
minimumValue : 2
maximumValue : 60
stepSize : 2
updateValueWhileDragging : true
value : 30
}
Rectangle {
Layout .fillHeight: true
Layout .fillWidth: true
Layout .minimumWidth: frequencyText .implicitWidth + 10
Layout .maximumWidth: frequencyText .implicitWidth + 10
Layout .alignment: Qt .AlignHCenter | Qt .AlignVCenter
Text {
id : frequencyText
text : "Freq: " + frequencySlider .value + " Hz"
anchors .fill: parent
verticalAlignment : Text .AlignVCenter
horizontalAlignment : Text .AlignHCenter
}
}
}
}
Rectangle {
Layout .fillHeight: true
Layout .fillWidth: true
Layout .minimumWidth: fpsText .implicitWidth + 10
Layout .maximumWidth: fpsText .implicitWidth + 10
Layout .alignment: Qt .AlignHCenter | Qt .AlignVCenter
border .color: "gray"
border .width: 1
radius : 4
Text {
id : fpsText
anchors .fill: parent
verticalAlignment : Text .AlignVCenter
horizontalAlignment : Text .AlignHCenter
}
}
Rectangle {
Layout .fillHeight: true
Layout .fillWidth: true
Layout .minimumWidth: selectionText .implicitWidth + 10
Layout .alignment: Qt .AlignHCenter | Qt .AlignVCenter
border .color: "gray"
border .width: 1
radius : 4
Text {
id : selectionText
anchors .fill: parent
verticalAlignment : Text .AlignVCenter
horizontalAlignment : Text .AlignHCenter
text : "No selection"
}
}
}
RowLayout {
id : buttonLayout
Layout .fillHeight: true
Layout .fillWidth: true
Layout .minimumHeight: flatShadingToggle .height
anchors .bottom: parent .bottom
spacing : 0
NewButton {
id : flatShadingToggle
Layout .fillHeight: true
Layout .fillWidth: true
text : surfaceSeries .flatShadingSupported ? "Show Flat" : "Flat not supported"
enabled : surfaceSeries .flatShadingSupported
onClicked : {
if (surfaceSeries .flatShadingEnabled === true ) {
surfaceSeries .flatShadingEnabled = false ;
text = "Show Flat"
} else {
surfaceSeries .flatShadingEnabled = true ;
text = "Show Smooth"
}
}
}
NewButton {
id : surfaceGridToggle
Layout .fillHeight: true
Layout .fillWidth: true
text : "Show Surface Grid"
onClicked : {
if (surfaceSeries .drawMode & Surface3DSeries .DrawWireframe ) {
surfaceSeries .drawMode &= ~Surface3DSeries .DrawWireframe ;
text = "Show Surface Grid"
} else {
surfaceSeries .drawMode |= Surface3DSeries .DrawWireframe ;
text = "Hide Surface Grid"
}
}
}
NewButton {
id : exitButton
Layout .fillHeight: true
Layout .fillWidth: true
text : "Quit"
onClicked : Qt .quit (0 );
}
}
}
}
function generateData () {
dataSource .generateData (mainView .sampleCache , mainView .sampleRows ,
mainView .sampleColumns , surfaceGraph .axisX .min ,
surfaceGraph .axisX .max , surfaceGraph .axisY .min ,
surfaceGraph .axisY .max , surfaceGraph .axisZ .min ,
surfaceGraph .axisZ .max )
}
}