====== Qt Quick and Javascript ====== * Qt Quick lists elements with properties, and JavaScript allows you to express more complex behavior than static values. Item { id: label1 x: 80 width: 100 height: 100 Image { source: { if(pressed) { return "img2.png"; } else { return "img1.png"; } } } } ===== Javascript functions ===== * You can add a Javascript function anywhere in your Qt Quick file. * The following defines and uses a function that picks a number and references it in an array of states. * FIXME ''Component.onCompleted'' hasn't been covered yet. {{youtube>04iD3JiZhkA?small}} import QtQuick 1.0 Item { id: myItem width: 400 height: 400 property int currentStateNumber: 0 function randomState() { var statesArray = ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']; var randomNumber; do { randomNumber = Math.floor(Math.random()*statesArray.length); } while (randomNumber == currentStateNumber); currentStateNumber = randomNumber; return statesArray[randomNumber]; } Image { source: "images/background.png" } Image { id: spaceship x: -200 y: 50 source: "images/spaceship.png" } Image { id: button source: "images/button.png" anchors.horizontalCenter: myItem.horizontalCenter anchors.bottom: myItem.bottom anchors.bottomMargin: 20 Text { id: label text: "PRESS" color: "white" anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top anchors.topMargin: 6 } MouseArea { anchors.fill: parent onClicked: { myItem.state = randomState(); } } } states: [ State { name: "bottomRight" PropertyChanges { target: spaceship x: 250 y: 200 } }, State { name: "bottomLeft" PropertyChanges { target: spaceship x: 100 y: 200 } }, State { name: "topLeft" PropertyChanges { target: spaceship x: 10 y: 50 } }, State { name: "topRight" PropertyChanges { target: spaceship x: 100 y: 50 } } ] transitions: [ Transition { NumberAnimation { properties: "x,y" duration: 500 easing.type: Easing.OutExpo } }, Transition { from: "" to: "topLeft" SequentialAnimation{ PauseAnimation { duration: 1000 } NumberAnimation { properties: "x,y" duration: 500 easing.type: Easing.OutExpo } } } ] Component.onCompleted:{ myItem.state = "topLeft"; } } ===== Importing a Javascript file ===== * If you want to organize your code, you can import a js file to Qt Quick: function randomState() { var statesArray = ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']; var randomNumber; do { randomNumber = Math.floor(Math.random()*statesArray.length); } while (randomNumber == currentStateNumber); currentStateNumber = randomNumber; return statesArray[randomNumber]; } import QtQuick 1.0 import "randomFile.js" as RandomFunction Item { id: myItem width: 400 height: 400 property int currentStateNumber: 0 Image { source: "images/background.png" } Image { id: spaceship x: -200 y: 50 source: "images/spaceship.png" } Image { id: button source: "images/button.png" anchors.horizontalCenter: myItem.horizontalCenter anchors.bottom: myItem.bottom anchors.bottomMargin: 20 Text { id: label text: "PRESS" color: "white" anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top anchors.topMargin: 6 } MouseArea { anchors.fill: parent onClicked: { myItem.state = RandomFunction.randomState(); } } } states: [ State { name: "bottomRight" PropertyChanges { target: spaceship x: 250 y: 200 } }, State { name: "bottomLeft" PropertyChanges { target: spaceship x: 100 y: 200 } }, State { name: "topLeft" PropertyChanges { target: spaceship x: 10 y: 50 } }, State { name: "topRight" PropertyChanges { target: spaceship x: 100 y: 50 } } ] transitions: [ Transition { NumberAnimation { properties: "x,y" duration: 500 easing.type: Easing.OutExpo } }, Transition { from: "" to: "topLeft" SequentialAnimation{ PauseAnimation { duration: 1000 } NumberAnimation { properties: "x,y" duration: 500 easing.type: Easing.OutExpo } } } ] Component.onCompleted:{ myItem.state = "topLeft"; } } -------------------------------------------------------------- ====== Resources ====== * {{:qt-quick-for-designers-1:images.zip|}} * All source code is subject to this [[copyright header|copyright]].