qml user interaction

31
Qt Quick for Qt Developers Qt Essentials - Training Course Produced by Nokia, Qt Development Frameworks Material based on Qt 4.7, created on January 18, 2011 http://qt.nokia.com 1/31

Upload: nishantapatil

Post on 06-Mar-2015

435 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Qml User Interaction

Qt Quick for Qt DevelopersQt Essentials - Training Course

Produced by Nokia, Qt Development Frameworks

Material based on Qt 4.7, created on January 18, 2011

http://qt.nokia.com

1/31

Page 2: Qml User Interaction

Module: User InteractionMouse InputKeyboard Input

User Interaction 2/31

Page 3: Qml User Interaction

Objectives

• Knowledge of ways to receive user input• mouse/touch input• keyboard input

• Awareness of different mechanisms to process input• signal handlers• property bindings

• Basic understanding of states and transitions• changing the current state• using state conditions

User Interaction 3/31

Page 4: Qml User Interaction

Module: User Interaction

Mouse InputKeyboard Input

User Interaction Mouse Input 4/31

Page 5: Qml User Interaction

Handling User Input

Users interact with Qt Quick user interfaces:

• Mouse movement, clicks and dragging• Keyboard input

User Interaction Mouse Input 5/31

Page 6: Qml User Interaction

Mouse AreasMouse areas define parts of the screen where cursor inputoccurs

• Placed and resized like ordinary items• using anchors if necessary

• Two ways to monitor mouse input:• handle signals• dynamic property bindings

See QML MouseArea Element Reference Documentation

User Interaction Mouse Input 6/31

Page 7: Qml User Interaction

Clickable Mouse Areaimport QtQuick 1.0

Rectangle {width: 400; height: 200; color: "lightblue"

Text {anchors.horizontalCenter: parent.horizontalCenteranchors.verticalCenter: parent.verticalCentertext: "Press me"; font.pixelSize: 48

MouseArea {anchors.fill: parentonPressed: parent.color = "green"onReleased: parent.color = "black"

}}

}Demo qml-user-interaction/ex-mouse-input/mouse-pressed-signals.qml

User Interaction Mouse Input 7/31

Page 8: Qml User Interaction

Placing the Mouse Area

Text {...MouseArea {

anchors.fill: parentonPressed: parent.color = "green"onReleased: parent.color = "black"

}

}

• Define a Text element• Define a MouseArea child element• Use an anchor to apply the area to the entire parent

User Interaction Mouse Input 8/31

Page 9: Qml User Interaction

Mouse Area Signals

Text {...MouseArea {

anchors.fill: parentonPressed: parent.color = "green"onReleased: parent.color = "black"

}

}

• Define responses to signals with onPressed and onReleased

• by default, only left clicks are handled• set the acceptedButtons property to change this

• These change the color of the parent Text element• Can do something similar with properties...

User Interaction Mouse Input 9/31

Page 10: Qml User Interaction

Mouse Hover and Properties

import QtQuick 1.0

Rectangle {width: 400; height: 200; color: "lightblue"

Rectangle {x: 150; y: 50; width: 100; height: 100color: mouse_area.containsMouse ? "green" : "white"

MouseArea {id: mouse_areaanchors.fill: parenthoverEnabled: true

}}

}Demo qml-user-interaction/ex-mouse-input/hover-property.qml

User Interaction Mouse Input 10/31

Page 11: Qml User Interaction

Enabling Mouse Hover

Rectangle {...color: mouse_area.containsMouse ? "green" : "white"

MouseArea {id: mouse_areaanchors.fill: parenthoverEnabled: true

}

}

• Ensure that the mouse area fills the parent’s area• Set the hoverEnabled property

User Interaction Mouse Input 11/31

Page 12: Qml User Interaction

Naming the Mouse Area

Rectangle {...color: mouse_area.containsMouse ? "green" : "white"

MouseArea {id: mouse_areaanchors.fill: parenthoverEnabled: true

}

}

• Give the MouseArea an id property• Refer to this mouse area as mouse_area

• Enables access to the mouse area’s properties

User Interaction Mouse Input 12/31

Page 13: Qml User Interaction

Using a Mouse Area Property

Rectangle {...color: mouse_area.containsMouse ? "green" : "white"

MouseArea {id : mouse_areaanchors.fill: parenthoverEnabled: true

}

}

• color is updated when mouse_area.containsMouse changes• Uses a simple JavaScript test• "green" if true• "white" if false

User Interaction Mouse Input 13/31

Page 14: Qml User Interaction

Mouse Area Hints and Tips

• A mouse area only responds to its acceptedButtons

• the handlers are not called for other buttons, but• any click involving an allowed button is reported• the pressedButtons property contains all buttons• even non-allowed buttons, if an allowed button is also pressed

• With hoverEnabled set to false

• containsMouse can be true if the mouse area is clicked

User Interaction Mouse Input 14/31

Page 15: Qml User Interaction

Signals vs. Property Bindings

Which to use?

• Signals can be easier to use in some cases• when a signal only affects one other item

• Property bindings rely on named elements• many items can react to a change by referring to a property

• Use the most intuitive approach for the use case• Favor simple assignments over complex scripts

User Interaction Mouse Input 15/31

Page 16: Qml User Interaction

Module: User Interaction

Mouse InputKeyboard Input

User Interaction Keyboard Input 16/31

Page 17: Qml User Interaction

Keyboard Input

Basic keyboard input is handled in two different use cases:

• Accepting text input• TextInput and TextEdit

• Navigation between elements• changing the focused element• directional (arrow keys), tab and backtab

On page 27 we will see how to handle raw keyboard input.

User Interaction Keyboard Input 17/31

Page 18: Qml User Interaction

Assigning Focus

• UIs with just one TextInput

• focus assigned automatically• More than one TextInput

• need to change focus by clicking• What happens if a TextInput has no text?

• no way to click on it• unless it has a width or uses anchors

• Set the focus property to assign focus

User Interaction Keyboard Input 18/31

Page 19: Qml User Interaction

Using TextInputs

import QtQuick 1.0

Rectangle {width: 200; height: 112; color: "lightblue"

TextInput {anchors.left: parent.left; y: 16anchors.right: parent.righttext: "Field 1"; font.pixelSize: 32color: focus ? "black" : "gray"focus: true

}TextInput {

anchors.left: parent.left; y: 64anchors.right: parent.righttext: "Field 2"; font.pixelSize: 32color: focus ? "black" : "gray"

}}

User Interaction Keyboard Input 19/31

Page 20: Qml User Interaction

Getting the Focus

TextInput {anchors.left: parent.left; y: 16anchors.right: parent.righttext: "Field 1"; font.pixelSize: 32color: focus ? "black" : "gray"focus: true

}

• Set the focus property• Use anchors to ensure there is something to click on

Demo qml-user-interaction/ex-key-input/textinputs.qml

User Interaction Keyboard Input 20/31

Page 21: Qml User Interaction

Focus Navigation

TextInput {id: name_field...focus: trueKeyNavigation.tab: address_field

}

TextInput {id: address_field...KeyNavigation.backtab: name_field

}

• The name_field item defines KeyNavigation.tab• pressing Tab moves focus to the address_field item

• The address_field item defines KeyNavigation.backtab• pressing Shift+Tab moves focus to the name_field item

Demo qml-user-interaction/ex-key-input/tab-navigation.qml

User Interaction Keyboard Input 21/31

Page 22: Qml User Interaction

Key Navigation

import QtQuick 1.0

Rectangle {width: 400; height: 200; color: "black"

Rectangle { id: left_rectx: 25; y: 25; width: 150; height: 150color: focus ? "red" : "darkred"KeyNavigation.right: right_rectfocus: true }

Rectangle { id: right_rectx: 225; y: 25; width: 150; height: 150color: focus ? "#00ff00" : "green"KeyNavigation.left: left_rect }

}

• Using cursor keys with non-text items• Non-text items can have focus, too

User Interaction Keyboard Input 22/31

Page 23: Qml User Interaction

Key Navigation

Rectangle { id: left_rectx: 25; y: 25; width: 150; height: 150color: focus ? "red" : "darkred"KeyNavigation.right: right_rectfocus: true }

Rectangle { id: right_rectx: 225; y: 25; width: 150; height: 150color: focus ? "#00ff00" : "green"

KeyNavigation.left: left_rect }

• left_rect has the focus initially• Define relationships between left_rect and right_rect

• using id and KeyNavigation

Demo qml-user-interaction/ex-key-input/key-navigation.qml

User Interaction Keyboard Input 23/31

Page 24: Qml User Interaction

Summary

Mouse and cursor input handling:• MouseArea receives clicks and other events• Use anchors to fill objects and make them clickable• Respond to user input:

• give the area a name and refer to its properties, or• use handlers in the area and change other named items

Key handling:• TextInput and TextEdit provide text entry features• Set the focus property to start receiving key input• Use anchors to make items clickable

• lets the user set the focus• KeyNavigation defines relationships between items

• enables focus to be moved• using cursor keys, tab and backtab• works with non-text-input items

User Interaction Keyboard Input 24/31

Page 25: Qml User Interaction

Exercise – User Input

• Which element is used to receive mouse clicks?• Name two ways TextInput can obtain the input focus?• How do you define keyboard navigation between items?

User Interaction Keyboard Input 25/31

Page 26: Qml User Interaction

Lab – Menu Screen

• Using the partial solution as a starting point, create a userinterface similar to the one shown above with these features:• items that change color when they have the focus• clicking an item gives it the focus• the current focus can be moved using the cursor keys

Lab qml-user-interaction/lab-menu-screen

User Interaction Keyboard Input 26/31

Page 27: Qml User Interaction

Raw Keyboard Input

• Raw key input can be handled by items• with predefined handlers for commonly used keys• full key event information is also available

• The same focus mechanism is used as for ordinary text input• enabled by setting the focus property

• Key handling is not an inherited property of items• enabled using the Keys attached property

• Key events can be forwarded to other objects• enabled using the Keys.forwardTo attached property• accepts a list of objects

User Interaction Keyboard Input 27/31

Page 28: Qml User Interaction

Raw Keyboard Input

import QtQuick 1.0

Rectangle {width: 400; height: 400; color: "black"

Image {id: rocketx: 150; y: 150source: "../images/rocket.svg"transformOrigin: Item.Center

}

Keys.onLeftPressed:rocket.rotation = (rocket.rotation - 10) % 360

Keys.onRightPressed:rocket.rotation = (rocket.rotation + 10) % 360

focus: true}

User Interaction Keyboard Input 28/31

Page 29: Qml User Interaction

Raw Keyboard Input

• Can use predefined handlers for arrow keys:

Keys.onLeftPressed:rocket.rotation = (rocket.rotation - 10) % 360

Keys.onRightPressed:

rocket.rotation = (rocket.rotation + 10) % 360

• Or inspect events from all key presses:

Keys.onPressed: {if (event.key == Qt.Key_Left)

rocket.rotation = (rocket.rotation - 10) % 360;else if (event.key == Qt.Key_Right)

rocket.rotation = (rocket.rotation + 10) % 360;

}

User Interaction Keyboard Input 29/31

Page 30: Qml User Interaction

Focus Scopes

• Focus scopes are used to manage focus for items• FocusScope delegates focus to one of its children• When the focus scope loses focus

• remembers which one has the focus• When the focus scope gains focus again

• restores focus to the previously active item

User Interaction Keyboard Input 30/31

Page 31: Qml User Interaction

c© 2010 Nokia Corporation and its Subsidiary(-ies).

The enclosed Qt Training Materials are provided under the CreativeCommons Attribution ShareAlike 2.5 License Agreement.

The full license text is available here:http://creativecommons.org/licenses/by-sa/2.5/legalcode

Nokia, Qt and the Nokia and Qt logos are the registered trademarks ofNokia Corporation in Finland and other countries worldwide.

User Interaction Legal 31/31