diff options
-rw-r--r-- | src/quick/doc/src/appdevguide/applicationdevelopers.qdoc | 21 | ||||
-rw-r--r-- | src/quick/doc/src/appdevguide/qml-intro.qdoc | 1287 |
2 files changed, 2 insertions, 1306 deletions
diff --git a/src/quick/doc/src/appdevguide/applicationdevelopers.qdoc b/src/quick/doc/src/appdevguide/applicationdevelopers.qdoc index 36abc0eaa8..ab96a6ccdf 100644 --- a/src/quick/doc/src/appdevguide/applicationdevelopers.qdoc +++ b/src/quick/doc/src/appdevguide/applicationdevelopers.qdoc @@ -25,18 +25,6 @@ ** ****************************************************************************/ -/* -XXX - -The "QML Intro" section has been temporarily removed, as it includes mostly -outdated information. However, it has some pertinent information, so we -should review it and extract the useful documentation at some point, for -inclusion somewhere in the documentation. In particular, the documentation -related to using QtCreator for QML development seems useful. - -\li \l{qml-intro.html}{Introduction to QML Application Development} -*/ - /*! \page qtquick-applicationdevelopers.html \title QML Application Developer Resources @@ -61,13 +49,8 @@ through other modules. If you require the functionality of those modules, you sh their QML documentation. Qt Essentials modules exposing QML types include: \list -\li \c Qt3D for 3D graphics rendering. -\li \c QtSensors for using device sensors such as accelerometers. -\li \c QtMultimedia for playing and managing multimedia content and cameras. -\li \c QtLocation for using GPS and mapping data. -\li \c QtSystems for reading system info and interacting with services. -\li \c QtWebkit for rendering web content. -\li \c QtPim for interacting with contact and calendar information. +\li \l QtMultimedia for playing and managing multimedia content and cameras. +\li \l QtWebkit for rendering web content. \endlist \section1 Quick Start diff --git a/src/quick/doc/src/appdevguide/qml-intro.qdoc b/src/quick/doc/src/appdevguide/qml-intro.qdoc deleted file mode 100644 index fe7cf6642d..0000000000 --- a/src/quick/doc/src/appdevguide/qml-intro.qdoc +++ /dev/null @@ -1,1287 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** 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 Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/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: http://www.gnu.org/copyleft/fdl.html. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/*! -\page qml-intro.html tutorial -\title Introduction to QML Application Development -\brief Introduction to the concepts and features behind QML. - -QML is a declarative language designed to describe the user interface of a -program: both what it looks like, and how it behaves. In QML, a user -interface is specified as a tree of objects with properties. - -This introduction is meant for those with little or no programming -experience. JavaScript is used as a scripting language in QML, so you may want -to learn a bit more about it (see the \l{qtqml-javascript-topic.html} -{Javascript integration in QML} documentation) before diving deeper into QML. -It is also helpful to have a basic understanding of other Web technologies like -HTML and JSON, but it is not required. - -The examples shown in this guide are located in the -\c{examples/quick/tutorials/qmlintro} directory within the Qt source -package. You can run then with the \l{qtquick-qmlscene.html}{qmlscene} tool. They make -use of the Qt Quick module (which provides the standard library of -QML types and functionality for the QML language). - -\section1 \l{QML Concepts and Syntax} -\tableofcontents{1 QML Concepts and Syntax}{section4} - -\section1 \l{Composing User Interfaces with QML} -\tableofcontents{1 Composing User Interfaces with QML}{section4} - -\section1 \l{User Interaction with QML} -\tableofcontents{1 User Interaction with QML}{section4} - -\section1 \l{QML Application Development Tools} -\tableofcontents{1 QML Application Development Tools}{section4} -*/ - -/*! -\page qml-intro-basic-syntax.html -\brief The basic syntax and concepts of the QML language. -\contentspage Introduction to QML Application Development -\previouspage Introduction to QML Application Development -\nextpage Composing User Interfaces with QML -\title QML Concepts and Syntax - -\tableofcontents - -This chapter covers the basic syntax of the QML language through the -use of examples, introducing the concepts behind the language and -the terminology used in the reference documentation. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-basic-syntax.png -\enddiv -The following example shows the basic syntax of QML. When opened in -the \l{qtquick-qmlscene.html}{qmlscene} tool, the output displayed should match the -image shown on the right: a light blue rectangle. - -\snippet examples/quick/tutorials/qmlintro/basic-syntax.qml document - -In this example, we import the features defined by Qt Quick 1.0, and -we declare and create a single rectangle with width, height and color. -Let's take a look at the main points of the language introduced by -this simple example. - -\section1 Importing Modules - -The \c import statement imports the QtQuick module, which contains all of the -standard QML types. A \l{qtqml-modules-topic.html}{module} makes a particular -set of types available to the QML code that imports it; without this import -statement, the \l Rectangle and other visual object types would not be -available. - -A specific version of a module is imported. This guarantees that the -QML types imported when the application is run by the user match those -used by the developer when the application was written, ensuring that -they have the expected behavior. - -\section1 Object Declarations - -The rectangle in the above example is specified by the \l Rectangle -object definition. When we declare objects like this, we write the object's type -followed by a pair of braces in between which additional data can be -defined for the object, such as its property values and any child objects. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-elements1.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/elements1.qml document - -Here, we create two visual items: a rectangle with an image inside it. We say that -the rectangle is the parent visual item and the image is its child. Since the -rectangle does not have a parent, it is a top level visual item. - -The position of each visual item in the user interface is defined relative -to the position of its parent, except for the top level visual item whose -position is always the top-left corner of the screen. - -QML files can contain multiple object declarations, but \e{only one} can be a top level -visual item. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-elements2.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/elements2.qml document - -In this example, we can define as many objects inside the rectangle -as we like, but we cannot define other top level visual items. All the -additional objects are defined inside the light blue rectangle. - -\list -\li When we talk about an \e{object definition}, we mean the syntactic structure, - including the name, the opening and closing braces, and its contents. -\li A \e{visual item} is a declaration of an object that has a visual appearance. All visual items are - objects that inherit \l Item either directly or indirectly. For example, - a \l Rectangle is a visual item, but a \l State is a (non-visual) object because it does - not have an intrinsic appearance. -\endlist - -Note that all object definitions in QML are QML object types. The QML type system -provides basic types and object types. A full list of object types provided by -Qt Quick is described on the \l{qtquick-qmltypereference.html}{Qt Quick QML Type Reference} page. - -\section1 Properties - -A QML object usually has various \e properties that help define the object. -For example, all items have the \l{Item::}{x} and \l{Item::}{y} properties -that define the position of the item relative to its parent item (or the -screen's origin) and \l{Item::}{width} and \l{Item::}{height} properties -that define its dimensions. All simple properties have names that begin -with a lower case letter. - -\section2 Setting Properties - -Properties are specified with a \c{property: value} syntax. In the above -example, we can see the \l Image object has a property named \c source, -which has been assigned the value \c{"pics/logo.png"}. The property and its -value are separated by a colon. - -Properties can be specified one-per-line: - -\qml -Rectangle { - width: 100 - height: 100 -} -\endqml - -or you can put multiple properties on a single line: - -\qml -Rectangle { width: 100; height: 100 } -\endqml - -When multiple property-value pairs are specified on a single line, they -must be separated by a semicolon. - -\section2 Basic Property Types - -QML supports properties of many types (see the documentation about the -\l{qtqml-typesystem-topic.html}{QML type system}). The basic types -include \c int, \c real, \c bool, \c string and \c color. - -\qml -Item { - x: 10.5 // a 'real' property - state: "details" // a 'string' property - focus: true // a 'bool' property - // ... -} -\endqml - -QML properties are what is known as \e type-safe. That is, they only allow you -to assign a value that matches the property type. For example, the \c x property -of item is a real, and if you try to assign a string to it you will get an error. - -\badcode -Item { - x: "hello" // illegal! -} -\endcode - -Property values are dynamic, responding to changes in the user interface. -See the \l{#Property Change Notifications}{Property Change Notifications} -section for information on the different ways to define properties, bind -them together and react to changes. - -\section2 Grouped Properties -\target dot properties - -Some objects contain a set of related properties that form a logical group; -these use a "dot" or grouped notation to show this. The \l Text item is one -such item that uses groups of properties to describe the font used to -display text. - -Grouped properties can be written like this: - -\snippet examples/quick/tutorials/qmlintro/grouped-properties1.qml text with grouped properties - -or like this: - -\snippet examples/quick/tutorials/qmlintro/grouped-properties2.qml text with grouped properties - -In the object documentation, grouped properties are shown using the "dot" notation. - -\section2 List Properties - -Some properties have a value which is a list of other objects, such as \l State, \l Item or -\l Transition. For example, the \l{Item::}{states} property is used like -this: - -\qml -Item { - states: [ - State { name: "stop" }, - State { name: "go" } - ] -} -\endqml - -The list is enclosed in square brackets, with a comma separating the list -objects. In cases where you are only assigning a single object to a list, -you can omit the square brackets: - -\qml -Item { - states: State { name: "stop" } -} -\endqml - -Objects in the list can be accessed by index. See the \l{list}{list type} -documentation for more details about list properties and their available -operations. - -\section1 Expressions - -JavaScript expressions can be used to assign property values. For example: - -\qml -Item { - width: 100 * 3 - height: 50 + 22 -} -\endqml - -These expressions can include references to other objects and properties, in -which case a \l{qtqml-syntax-propertybinding.html}{binding} is established: when the value of -the expression changes, the property to which the expression is assigned is -automatically updated to the new value. For example: - -\div {class="float-right"} -\inlineimage declarative-qmlintro-property-binding1.png - -\inlineimage declarative-qmlintro-property-binding2.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/property-binding.qml elements - -Here, the child \l Rectangle item's \c width property is set relative to -the width of its parent. Whenever the parent's width changes, the width of -the \l Rectangle is automatically updated. This uses the special \c parent -property to refer to a parent item, which we explore in the -\l{Object Identifiers}{next section}. - -This is useful for relating the size of one visual object to another, so that -changes to the sizes of a visual object in the design, or at run-time, will be -taken into account. - -Property binding works with all types of properties, not just those related -to the size of a visual object. - -\section1 Object Identifiers - -Each object can be given a special \e id value that allows the object to -be identified and referred to by other objects. An \c id must begin with -a lower-case letter or an underscore, and cannot contain characters other -than letters, numbers and underscores. - -For example, below we define a \l Text object and a \l Rectangle object -as children of a \l Column object. The \l Text object has an \c id value -of \c{textElement}. The Rectangle object defines its \c width property -to be the same as that of the Text object by referring to -\c{textElement.width}: - -\div {class="float-right"} -\inlineimage declarative-qmlintro-object-identifiers.png -\enddiv - -\snippet examples/quick/tutorials/qmlintro/object-identifiers.qml document - -An object can be referred to by its \c id from anywhere within the -\l{qtqml-documents-topic.html}{component} in which it is declared. Therefore, an -\c id value must always be unique within a single component. -This means that a single QML document should only contain one place where -a particular \c id value is defined. - -The \c id value is a special value for a QML object and should not be -thought of as an ordinary object property; for example, it is not possible -to access \c{textElement.id} in the above example. Once an object is -created, its \c id cannot be changed. - -\note The \c parent value is a special identity that each object can use -to refer to its parent item. For most simple user interfaces containing -a few display items, the parent of an item will be the enclosing object -in the QML file that contains it. However, when we look at more complex -ways to arrange and display items, we will find that this is not always -the case. - -\section1 Comments - -Commenting in QML is similar to JavaScript. -\list -\li Single line comments start with // and finish at the end of the line. -\li Multi-line comments start with /* and finish with *\/ -\endlist - -Comments are ignored by the QML engine. They are useful for explaining what -you are doing; for referring back to at a later date, or for others reading -your QML files. - -\snippet examples/quick/tutorials/qmlintro/comments.qml commenting - -Comments can also be used to prevent the execution of code, which is -sometimes useful for tracking down problems. In the above example, the -\l Text object will have normal opacity, since the line containing the -opacity property has been turned into a comment. - -\section1 Responding to Changes - -User interfaces created using QML contain items such as \l Rectangle, -\l Image and \l Text to display content, but they can also contain items -that accept user input, such as \l TextInput and \l MouseArea. When the -user interacts with these items, they emit signals to inform other -components of any change. These signals can be received by the items -themselves; this is the main way to create items that respond to the user. - -\section2 Signal Handlers - -Signal handlers allow JavaScript code to be executed in response to a signal. -For example, the \l MouseArea object has an \l{MouseArea::}{onClicked} handler -that can be used to respond to a mouse click. Below, we use this handler to -print a message whenever the mouse is clicked: - -\snippet examples/quick/tutorials/qmlintro/signal-handlers.qml document - -All signal handlers begin with \e "on". - -Some signal handlers include an optional parameter. For example -the MouseArea \l{MouseArea::}{onPressed} signal handler has a \c mouse parameter -that contains information about the mouse press. This parameter can be -referred to in the JavaScript code, as below: - -\snippet examples/quick/tutorials/qmlintro/signal-handlers-parameters.qml mouse area - -\section2 Property Change Notifications - -When a property changes value, it can send a signal to notify others of this change. - -To receive these signals, simply create a \e{signal handler} named with an -\e on<Property>Changed syntax. For example, the \l TextInput type has a -\l{TextInput::}{text} property. When this property changes, the \c textChanged -signal is emitted. We can monitor this property for changes with the -\c onTextChanged handler. - -\table -\header \li Property \li Signal \li Signal Handler -\row \li \l{TextInput::}{text} \li \c textChanged \li \c onTextChanged -\endtable - -The following code shows this in practice: - -\div {class="float-right"} -\inlineimage declarative-qmlintro-property-change1.png - -\inlineimage declarative-qmlintro-property-change2.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/property-change.qml property change - -When the user modifies the text, the expression assigned to the \c textChanged -handler will be evaluated. In this example, the text changes color when this -happens. - -Similarly, the \l Rectangle type has \l{Item::}{width} and -\l{Rectangle::}{color} properties. Below, we have a \l Rectangle object -that has defined two signal handlers, \c onWidthChanged and \c onColorChanged, -which will automatically be called whenever these properties are modified: - -\qml -Rectangle { - width: 100; height: 100 - - onWidthChanged: console.log("Width has changed to:", width) - onColorChanged: console.log("Color has changed to:", color) -} -\endqml - -These cause the new values of these properties to be written to the console, -which can be useful for debugging purposes. - -\section2 Attached Properties -\target attached-properties - -Some objects attach properties to other objects. This is used in cases -where one object needs to access features of another, but does not -inherit properties to access those features. - -Attached Properties are of the form \e {<Type>.<property>} where \e <Type> -is the type of the object that attaches \e <property>. - -An example of attached properties in use involves the \l Keys type which -attaches properties for handling key presses to any item. For example: - -\div {class="float-right"} -\inlineimage declarative-qmlintro-attached-properties.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/attached-properties.qml attached properties - -The \l Keys properties are not defined by the \l Item type. They are -defined separately and attached to the item. - -Attached properties are also used by delegates to reference information about -the view they are used in. For example, the \l ListView type attaches -the \e ListView.isCurrentItem property to each delegate it creates: - -\div {class="float-right"} -\inlineimage declarative-qmlintro-attached-properties-view.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/attached-properties-view.qml delegate with attached property - -In effect, by attaching this property, \l ListView provides an interface -that lets the delegate access information about the current item in the -view it appears in. - -The use of attached properties will be covered in more depth later in this -guide. - -\omit -\section2 Default Properties - -Each object type can specify one of its list or object properties as its default property. -If a property has been declared as the default property, the property tag can be omitted. - -For example this code: -\qml -State { - changes: [ - PropertyChanges {}, - PropertyChanges {} - ] -} -\endqml - -can be simplified to: - -\qml -State { - PropertyChanges {} - PropertyChanges {} -} -\endqml - -because \c changes is the default property of the \c State type. -\endomit -*/ - -/*! -\page qml-intro-composing-uis.html -\contentspage Introduction to QML Application Development -\previouspage QML Concepts and Syntax -\nextpage User Interaction with QML -\title Composing User Interfaces with QML -\brief How to arrange items with anchors. - -\tableofcontents - -In the \l{Introduction to QML Application Development}{previous chapter}, we looked at -the syntax of QML and the basic building blocks that are used to create -user interfaces. For example, at a low level, we have seen that an item's -\c x and \c y properties are used to position it within its parent item. -However, when defining more complex user interfaces, especially those with -items that will move or change size, we need a way to arrange items in a -more systematic way. - -\section1 Anchors and Anchor Lines - -In the previous examples, all the items have been given either absolute -positions in the user interface or positions relative to their parents. -For more flexibility, both at design-time and in the case where the user -interface changes at run-time, we prefer to use anchors to arrange items. - -Anchors connect items together visually, creating relationships between -their geometries. As a result, mixing absolute positioning and anchors -is only recommended in cases where the constraints imposed by each -approach do not conflict. Anchors can only be used to relate items -with their parents, children or siblings. - -\section2 Anchoring within Items - -Anchors can be used to generally describe how items are positioned -within the space occupied by their parents. Two of the anchors are used -to place items in this way. - -The following example uses anchors to position a \l Text item in the -center of a \l Rectangle. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-anchors-centerin.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/anchors.qml centered text - -In this case, the center of the text item is anchored to the center of -its parent item by using the \c{anchors.centerIn} grouped property. -This defines a high level description of the relationship between the two -items. Similarly, the \c{anchors.fill} grouped property is used to describe -the case where an item needs to fill the space provided by its parent. - -\note When using \c{anchors.centerIn} and \c{anchors.fill}, the value of -the anchor property is an item. - -\section2 Anchor Lines - -At a lower level, anchors can be used to line up the edges of two items. -In the following example, the \l Text item is centered within its parent, -the \l Item that defines the user interface. The \l Rectangle uses anchors -to define its position relative to the text item. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-anchors-edges.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/anchors2.qml anchored items - -By giving the text item the \c textItem identifier, we can refer to it when -defining the anchors for the rectangle. We line up the right edge of the -rectangle with the left edge of the text item, and line up their top edges. - -This example shows the use of anchor lines. Grouped properties are defined -for key parts of each item, including its top, left, right and bottom edges, -plus the lines running through the horizontal center and vertical center of -the item. A baseline anchor line is also used for items that display text. - -\note We connect anchor lines to other anchor lines, not to items. - -\section2 Anchors and Property Bindings - -Since the anchor definitions are property bindings, any changes to the -position of an anchor will cause any connected anchors to move as well. -This is illustrated by the following example, which places a red rectangle -beneath a \l TextInput item and uses anchors to ensure that it is always -the same width. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-anchors-expanding1.png - -\inlineimage declarative-qmlintro-anchors-expanding2.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/anchors-expanding.qml anchored items - -The anchor lines on the left and right edges of the rectangle are connected -to those of the text input item. Since the text can be modified by the user, -the width of the item can change. The use of anchors causes the width of the -rectangle to change as well. - -The \l{qtquick-concepts-positioning-anchors.html}{Anchor-Based Layout in QML} -document covers the use of anchors in more detail. - -\section2 Margins - -Although anchors are useful for lining up items, it is often useful to leave -small gaps between the edges of adjacent items. The following example lines -up an \l Image item with a \l Text item, but uses a margin to leave a gap -between them. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-anchors-margins.png - -\inlineimage declarative-qmlintro-anchors-baseline-margins.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/anchors-margins.qml anchored items - -Note that the image also uses a margin to leave a gap between its left edge -and the left edge of the user interface. - -Adding \l Rectangle items to the scene description, we can see the effects of -the anchors and margins, with the image displaced from the left edge of its -parent item and the text label displaced from the right edge of the image. - -\section2 Limitations and Strategies - -Anchors allow the relationships between items to be described using simple -declarations, maintaining a user interface layout when items move or change -size. They are useful in most situations, but have limitations which need -to be considered, and therefore it is a good idea to adopt strategies for -using them. - -\section3 Limitations of Anchors - -Since anchors can only be used to relate an item with its parent, children or -siblings, care must be taken when referencing items in complex or deeply-nested -user interfaces. Where there are lots of items to be arranged, it can be more -productive to use \l{#Positioners}{positioners} and -\l{Generating Items with Repeaters}{repeaters}, or -\l{qtquick-concepts-data-modelview.html}{models and views}. - -Connections between anchors cannot be deleted and will override explicit -declarations of positions and sizes using the \l{Item::}{x}, \l{Item::}{y}, -\l{Item::}{width} and \l{Item::}{height} properties of items. - -Since anchors rely on property binding to ensure that items are dynamically -updated if one of them changes, each anchor definition creates a new dependency -on another item. Use of anchors therefore causes a dependency graph defining an -order in which items will be updated. Problems can occur if circular dependencies -are created between items. The following example shows this occurring with a -parent item and its child. - -\snippet examples/quick/tutorials/qmlintro/circular.qml circular - -\section3 Strategies for Use - -In order to reference an item with an anchor, it needs a way to be identified. -Children of the item can refer to it as \c parent, but otherwise it needs to -define an \l{QML Concepts and Syntax#Object Identifiers}{identifier}. -It is good practice to define identifiers for all the items that need to be -positioned or referenced in some way unless those items can be referenced -using the \c parent identifier. - -It is usually helpful to identify the fixed or dominant parts of the user -interface and give those items identifiers so that dependent items can refer -to them. This avoids potential issues with circular dependencies. -In the example shown, the \c launchBox and \c cancelBox items are anchored -within the top level item that contains the user interface. Each of these -items contain an image and a text item that are anchored to their parent. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-anchors-strategy-annotated.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/anchors-strategy.qml anchor strategy - -The above example shows how each item is anchored to its parent. This ensures -that the dependencies introduced by the anchors all consistently point to each -item's parent or a sibling. It is not always possible to ensure such simple -dependencies between items. As a result, it is often necessary to consider -other factors that determine how the use of anchors will affect the geometries -of items. - -When positioning items using the \c horizontalCenter anchor, do not use the -\c left or \c right anchors; define the width of the item instead, either as -a fixed value or as a proportion of the parent item. Similarly, avoid using -the \c top or \c bottom anchors with the \c verticalCenter anchor; set the -height of the item instead. - -Items that define their own width and height based on their contents, like -\l Image or \l TextInput, can be used with all kinds of anchors. Care must -be taken to avoid imposing conflicting constraints on their dimensions. -For example, using \c left and \c right anchors to position a text input -item may be problematic because the item determines its own width and it -may change. - -When defining an item that you want to stretch to fill the available space -between other items, make sure that you anchor the stretchable item to items -with well-defined or implicitly-defined sizes and not the other way round. -The following example shows this with a \l Text item with an implicit size -and a \l Rectangle that stretches to fill the remaining space in its parent -item. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-anchors-stretch.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/anchors-stretch.qml items - -The rectangle uses anchors to define its top, left and right edges in terms -of its parent item, and the bottom edge is aligned with the top of the text -item. If, instead, the text item is anchored to the rectangle, which has no -implicit size, the layout of the user interface will be broken because the -rectangle will be assigned a zero height. - -\section1 Positioners - -Positioner items are container items that manage the positions and sizes of -items in a declarative user interface. Positioners behave in a similar way to -the \l{Widgets and Layouts}{layout managers} used with standard Qt widgets, -except that they are also containers in their own right. - -Positioners make it easier to work with many items when they need to be -arranged in a regular layout. As we will see when we encounter -\l{Generating Items with Repeaters}{Repeaters}, it is easier to describe -how items should be arranged when there are many of them than it is to -try and individually position them. - -\section2 Standard Positioners - -A set of standard positioners are provided in the basic set of Qt Quick items. -Since these are all based on the \l Item type, they contain properties that -define their positions and sizes, but they do not have any visual appearance -of their own; they simply arrange their child items in the space allocated to -them. Any background color, if desired, must be added to a parent Rectangle. - -\list -\li \l{#Row}{Row} arranges its children in a row. -\li \l{#Column}{Column} arranges its children in a column. -\li \l{#Grid}{Grid} arranges its children in a grid. -\li \l{#Flow}{Flow} arranges its children like words on a page. -\endlist - -Each of these items provides many of the same properties as the others, -making it easy to exchange one with another at a later point in the design -of an application or component. The common properties are \c spacing, -\c add and \c move. As expected, the \l{Row::spacing}, \l{Column::spacing} -and \l{Grid::spacing} properties have slightly different meanings because -they describe how space is added to different kinds of layout. - -The \c add and \c move properties describe what should happen when items -are added to a positioner item or moved within it. These actions are -described with \l{qtquick-concepts-statesanimations-animations.html} -{transitions}, and will be covered later. - -\section3 Row - -\l Row items are used to horizontally arrange items. The following example -uses a Row item to arrange three rounded \l Rectangle items in an area defined -by an outer colored Rectangle. The \l{Row::spacing}{spacing} property is set to -include a small amount of space between the rectangles. - -\div {class="float-right"} -\inlineimage qml-row.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/row.qml document - -We ensure that the parent \l Rectangle is large enough so that there is some space -left around the edges of the horizontally centered Row item. The equally-sized -rectangles in this example automatically line up because they each have the -same height. Items with different heights will not be positioned vertically -by the \l Row; these need to be lined up using anchors. - -Since the \l Row item is responsible for positioning its child items -horizontally, those child items cannot use anchors to position themselves -within the row. However, they can use anchors to align themselves vertically -relative to one another or to the row itself. The following example uses -\c verticalCenter anchors to vertically align three rectangles with -different sizes. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-row-anchors.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/row-anchors.qml row - -Note that the \l Row item itself uses \c horizontalCenter and \c verticalCenter -anchors to place itself in the center of its parent. It is free to do this -because it is not being positioned by its parent, a \l Rectangle. However, -when we place positioners inside other positioner, such as a \l Row inside -a \l Column, we will need to be aware of what constraints are being imposed -by the positioner's parent item. This is -\l{#Nesting Positioner Items}{discussed later} in this chapter. - -The height of the row is dependent on the heights of the individual child -items and, unless specified using the \c height property or with anchors, -it will only be as high as the tallest child item. - -\section3 Column - -\l Column items are used to vertically arrange items. The following example -uses a Column item to arrange three \l Rectangle items in an area defined -by an outer \l Item. The \l{Column::spacing}{spacing} property is set to -include a small amount of space between the rectangles. - -\div {class="float-right"} -\inlineimage qml-column.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/column.qml document - -In the above example, each of the rounded rectangles are positioned by the -\l Column item. The column only changes the vertical positions of its -child items and does not restrict their horizontal positions. However, -the restrictions on the use of anchors do not apply to the children of -these child items, so each \l Text item uses its \c centerIn anchor to -horizontally and vertically align itself within its parent rectangle. - -The width of the column is dependent on the widths of the individual child -items and, unless specified using the \c width property or with anchors, -it will only be as wide as the widest child item. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-column-anchors.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/column-anchors.qml document - -The example above stretches the column horizontally to fill the entire -user interface, and stretches each rectangle inside to fill the column. -The text items behave as they did in the previous example. - -\section3 Grid - -\l Grid items are used to place items in a grid or table arrangement. -The following example uses a Grid item to place four \l Rectangle items -in a 2-by-2 grid. As with the other positioners, the spacing between items -can be specified using the \l{Grid::spacing}{spacing} property. - -\div {class="float-right"} -\inlineimage qml-grid-spacing.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/grid-spacing.qml document - -There is no difference between horizontal and vertical spacing inserted -between items, so any additional space must be added within the items -themselves. Any empty cells in the grid must be created by defining -placeholder items at the appropriate places in the grid definition. - -As with the \l Row and \l Column items, \l Grid items restrict the anchors -used by their child items. Since they position items both horizontally -and vertically, it is not possible to use any of the anchors to align -items within the grid. However, we can use placeholder items as the grid's -child items and put visible items inside those, using anchors to align -them. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-grid-positioning.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/grid-positioning.qml document start -\snippet examples/quick/tutorials/qmlintro/grid-positioning.qml document end - -We only show the first item, but the principle is the same for the others. - -\section3 Flow - -\l Flow items are used to place items like words on a page, with rows or -columns of non-overlapping items. - -Flow items arrange items in a similar way to \l Grid items, with items -arranged in lines along one axis (the minor axis), and lines of items -placed next to each other along another axis (the major axis). The -direction of flow, as well as the spacing between items, are controlled -by the \l{Flow::}{flow} and \l{Flow::}{spacing} properties. - -The following example shows a Flow item containing a number of \l Text -child items. These are arranged in a similar way to those shown in the -screenshots. - -\div {class="float-right"} -\inlineimage qml-flow-text1.png - -\inlineimage qml-flow-text2.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/flow.qml document - -The main differences between the \l Grid and \l Flow positioners are that -items inside a \l Flow will wrap when they run out of space on the minor -axis, and items on one line may not be aligned with items on another line -if the items do not have uniform sizes. As with grid items, there is no -independent control of spacing between items and between lines of items. - -\section2 Nesting Positioner Items - -Since each positioner is based on \l Item, we can nest them like other -items, placing one positioner inside another. The following example shows a -\l Column that contains two \l Row positioners. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-nested-positioners.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/nested-positioners.qml column - -The example works around the restrictions on the use of anchors mentioned -earlier by using appropriate anchors for each item. The innermost items, -\l Text and \l Rectangle, use anchors for vertical positioning within -\l Row items, which each perform horizontal positioning of their child -items. - -The rows use anchors to position themselves within the \l Column item, which -arranges them vertically. The column is centered horizontally and vertically -within its parent, a non-positioning item. - -\section2 Strategies for Use - -Positioners are intended to be used in situations where it would be -tedious to apply anchors to a number of items. For this reason, they are -also used to position dynamically created items, such as those generated -by \l Repeater items. - -The items used with positioners must have a well-defined size, otherwise -positioners will not be able to determine where they should be placed, -leaving their positions undefined. When using a \l Column, it is sufficient -to give each child item a fixed height; the width can be defined using -anchors. Similarly, with a \l Row, the width of each item should be -fixed, but the height can be defined using anchors. Items used with \l Grid -and \l Flow positioners should have fixed widths and heights. -*/ - -/*! -\page qml-intro-user-interaction.html -\contentspage Introduction to QML Application Development -\previouspage Composing User Interfaces with QML -\nextpage Generating Items with Repeaters -\title User Interaction with QML -\brief Making items respond to user input. - -\tableofcontents - -So far, we have shown how to declare items and arrange them to create a user -interface. If we play a QML file using \l{qtquick-qmlscene.html}{qmlscene}, we can resize the -display window and see the items adapt to the change, but the items -themselves do not respond to user input from the keyboard or mouse. - -Unlike standard Qt widgets, items do not include intrinsic support for user -interaction. The features required for interactivity are added or applied to -items. - -QML provides the \l MouseArea item to handle mouse input and \l Keys and -\l KeyNavigation attached properties to handle keyboard input. These are -used with other items to make them responsive to user input. - -\section1 Mouse Areas - -To make items responsive to mouse clicks, we add \l MouseArea items to the -user interface, typically as children of the items we want to make -interactive. Since \l MouseArea is based on \l Item, it has a geometry, but -no visual appearance. The following example defines a mouse area with an -explicit position and size; the image shown indicates where the mouse area -is in the user interface, but it will not be visible in the running example. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-mousearea-annotated.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/mousearea.qml mouse area - -The \l{MouseArea::}{onPressed} and \l{MouseArea::}{onReleased} definitions -are \l{QML Concepts and Syntax#Signal Handlers}{signal handlers} that -contain JavaScript code that will be executed in response to a signal. In -this case, when the mouse button is pressed or released, the code will -change the color of the background. Other signal handlers can be defined -to handle other user input, such as \l{MouseArea::}{onClicked} and -\l{MouseArea::}{onDoubleClicked}. Some require additional configuration -of the item before they will work as expected, as we shall see later. - -\note It is more common to define mouse areas within items and position them -with anchors, as shown by the rest of the examples in this chapter. - -\section2 Handling Mouse Buttons - -The following example uses an anchor to fill a \l Text item with a mouse -area, and defines two signal handlers to response to mouse button input. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-mouse-pressed1.png - -\inlineimage declarative-qmlintro-mouse-pressed2.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/mouse-pressed-signals.qml text item - -The \l{MouseArea::}{onPressed} and \l{MouseArea::}{onReleased} -signal handlers are defined for the mouse area. As a result, when the user -presses a mouse button when the cursor is over the text, the color changes -to green; when the button is released, the color changes to black. - -Note that the mouse area only responds to the left mouse button by default. -This is because the default value of the \l{MouseArea::}{acceptedButtons} -is \l{Qt::LeftButton}{Qt.LeftButton}. To test for other buttons, set this -property to be the combination of the buttons required (using the OR -operator), as in the following example. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-mouse-pressed-buttons.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/mouse-pressed-buttons.qml items - -The mouse area covers the entire area of the user interface and accepts -input from both left and right buttons. Each of the rectangles defines its -color as an expression that depends on the mouse area's -\l{MouseArea::}{pressedButtons} property, testing whether the relevant -button is found in the value of this property. When a button is released, -the value is \c{Qt.NoButton}. - -\note The \l{MouseArea::}{pressed} property provides information about -whether or not a button was pressed in the mouse area, but does not -provide any more than a boolean value. This can be sufficient in many -situations. - -\section2 Finding the Cursor Position - -The \l MouseArea item contains a number of properties and signal handlers -that provide information about the mouse cursor. For example, the -\l{MouseArea::}{mouseX} and \l{MouseArea::}{mouseY} properties contain the -position of the cursor, as shown in the following example. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-mouse-pressed-position.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/mouse-pressed-position.qml text item - -When the user presses the mouse button over the text item, the text changes -to show the coordinates within the mouse area where the press occurred. If -we need to find the mouse position outside the text item, we should make -the mouse area a child of the text item's parent and use anchors to fill -that item instead. - -\section2 Mouse Hover - -In the previous examples, the text item and rectangles were updated only -when the mouse button was pressed. Consider a situation where we would like -to continuously update the text item with the mouse's position. In such a -case, we could try the following: - -\div {class="float-right"} -\inlineimage declarative-qmlintro-mouse-pressed-position2.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/mouse-pressed-position2.qml text item - -When we run this example, the text item shows the initial, default value of -the mouse area's \c mouseX and \c mouseY properties. Moving the cursor over -the text has no effect. It is only when the text item is clicked that the -text is updated. - -The reason for this is that, by default, the mouse area only updates various -properties when a button is pressed. To receive continuous updates about the -mouse cursor, we need to enable \e{mouse hover} by setting its -\l{MouseArea::}{hoverEnabled} property, as shown in the following example: - -\div {class="float-right"} -\inlineimage declarative-qmlintro-mouse-hover-enabled.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/mouse-hover-enabled.qml text item - -With mouse hover enabled, other properties of the \l MouseArea can be -monitored. For example, the \l{MouseArea::}{containsMouse} property can be -used to determine whether the mouse cursor is over the mouse area. -Previously, we only knew when this was the case because the user had to -press a mouse button over the area. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-mouse-hover-containsmouse1.png - -\inlineimage declarative-qmlintro-mouse-hover-containsmouse2.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/mouse-hover-containsmouse.qml items - -The above example uses \l{QML Concepts and Syntax#Expressions}{an expression} -to show the coordinates of the mouse cursor when it is in the mouse area, -\c area. When \c{area.containsMouse} evaluates to \c false, the \c{-} -character is shown instead. - -Certain signal handlers only become useful when mouse hover is enabled. -For example, the \l{MouseArea::}{onEntered}, \l{MouseArea::}{onExited} -and \l{MouseArea::}{onPositionChanged} signal handlers will be called -when the cursor enters, exits or changes position in the area. - -\section2 Dragging Items - -As well as handling the low level interaction details, the \l MouseArea item -also handles drag operations if the relevant properties are set. The -following example shows how dragging is enabled for an item. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-mouse-drag.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/mouse-drag.qml draggable item - -The item to be dragged is the \l Rectangle containing a \l MouseArea and -\l Text items. All that is required is to set the value of the -\l{MouseArea::}{drag.target} grouped property to the item we wish to enable -dragging for; in this case, the \c parent of the mouse area. When run, the -rectangle containing the text can be dragged around its parent's area. - -The other \c drag grouped properties allow the dragging behavior of the -item to be restricted and fine-tuned. \l{MouseArea::}{drag.axis} can be -set to only allow dragging to occur along the x or y axes, and the range -of positions to which the target item can be dragged can be limited to -a range specified by the \l{MouseArea::}{drag.minimumX}, -\l{MouseArea::}{drag.minimumY}, \l{MouseArea::}{drag.maximumX} and -\l{MouseArea::}{drag.maximumY} properties. - -\section2 Strategies for Use - -Mouse areas are applied to a user interface by using anchors to fill the -items that need to respond to user input. This makes them responsive to -button presses by default, and to mouse movement when the -\l{MouseArea::}{hoverEnabled} property is set to \c true. When a mouse -area is not needed to provide input, its \l{MouseArea::}{enabled} -property can be set to \c false, so that it ignores user input. - -When mouse buttons are pressed and released, the -\l{MouseArea::}{pressedButtons} property is updated as expected. However, -when multiple buttons are used, as in the -\l{#Handling Mouse Buttons}{example above}, the most up-to-date values -reported by this property are not necessarily propagated to the items -that use it. For this reason, it can be better to consider using signal -handlers to respond to mouse button presses and releases. - - -\section1 Key Handling - -Another important method of user input is via the keyboard. In addition to -the \l TextInput and \l TextEdit items, which accept keyboard input for -display purposes, QML provides facilities to allow items to capture key -presses, as well as higher level features for navigation using keys. - -Unlike mouse input, which uses the \l MouseArea item, key input uses two -attached properties to handle keyboard input: \l Keys and \l KeyNavigation. -These look like ordinary object properties, but can be applied to any item in order -to enable keyboard input support. - -\section2 Key Navigation - -In desktop user interfaces, it is usually helpful to provide a way for the -user to navigate between input fields or other interactive items by pressing -navigation keys, typically the cursor keys or the \key Tab key. The -\l KeyNavigation attached property is used to define the relationships -between items to allow this kind of navigation. - -The following example shows two \l Rectangle items placed in a \l Row -positioner. These are defined with identifiers, \c{leftRect} and -\c{rightRect}. - -\div {class="float-right"} -\inlineimage declarative-qmlintro-key-navigation1.png - -\inlineimage declarative-qmlintro-key-navigation2.png -\enddiv -\snippet examples/quick/tutorials/qmlintro/key-navigation.qml items - -The \c{leftRect} rectangle attaches the -\l{KeyNavigation::right}{KeyNavigation.right} property, setting it to refer -to the \c{rightRect} rectangle. The \c{rightRect} rectangle attaches the -\l{KeyNavigation::left}{KeyNavigation.left} property, referring to the -\c{leftRect} rectangle. - -Initially, the \c{leftRect} rectangle has the keyboard focus, since its -\l{Item::}{focus} property is set to \c true. When the user presses the -right cursor key, the focus is passed to the \c{rightRect} rectangle instead, -as defined by the \l KeyNavigation attached property for that item. Pressing -the left cursor key causes the focus to be passed back to \c{leftRect} -because as defined by the \l KeyNavigation attached property for -\c{rightRect}. - -*/ - -/*! -\page qml-intro-positioning-items.html -\contentspage Introduction to QML Application Development -\previouspage User Interaction with QML -\nextpage QML Application Development Tools -\title Generating Items with Repeaters -\brief How to generate and position items dynamically. - -\tableofcontents - -\section1 Repeaters - -\div {class="float-right"} -\inlineimage qml-repeater-grid-index.png -\enddiv - -Repeaters create items from a template for use with positioners, using data -from a model. Combining repeaters and positioners is an easy way to lay out -lots of items. A \l Repeater item is placed inside a positioner, and generates -items that the enclosing positioner arranges. - -Each Repeater creates a number of items by combining each row of data -from a model, specified using the \l{Repeater::model}{model} property, with -the template item, defined as a child item within the Repeater. -The total number of items is determined by the amount of data in the model. - -The following example shows a repeater used with a \l{#Grid}{Grid} item to -arrange a set of Rectangle items. The Repeater item creates a series of 24 -rectangles for the Grid item to position in a 5 by 5 arrangement. - -\snippet qml/repeaters/repeater-grid-index.qml document - -The number of items created by a Repeater is held by its \l{Repeater::}{count} -property. It is not possible to set this property to determine the number of -items to be created. Instead, as in the above example, we use an integer as -the model. This is explained in the \l{QML Data Models#An Integer}{QML Data Models} -document. - -It is also possible to use a delegate as the template for the items created -by a Repeater. This is specified using the \l{Repeater::}{delegate} property. - -\section1 Using Transitions - -Transitions can be used to animate items that are added to, moved within, -or removed from a positioner. - -Transitions for adding items apply to items that are created as part of a -positioner, as well as those that are reparented to become children of a -positioner. -Transitions for removing items apply to items within a positioner that are -deleted, as well as those that are removed from a positioner and given new -parents in a document. - -Additionally, changing the opacity of items to zero will cause them to -disappear using the remove transition, and making the opacity non-zero will -cause them to appear using the add transition. - -\section1 Other Ways to Position Items - -There are several other ways to position items in a user interface. In addition -to the basic technique of specifying their coordinates directly, they can be -positioned relative to other items with \l{anchor-layout}{anchors}, or used -with \l{QML Data Models} such as -\l{QML Data Models#VisualItemModel}{VisualItemModel}. -*/ - -/*! -\page qml-intro-tools.html -\contentspage Introduction to QML Application Development -\previouspage Generating Items with Repeaters -\nextpage Introduction to QML Application Development -\title QML Application Development Tools -\brief Tools provided to enable rapid QML application development - -\tableofcontents - -\section1 Qt Creator Tools - -Qt Creator is a complete integrated development environment (IDE) for creating -applications with Qt Quick and the Qt application framework. - -\image qmldesigner-visual-editor.png - -The main goal for Qt Creator is meeting the development needs of Qt Quick -developers who are looking for simplicity, usability, productivity, -extendibility and openness, while aiming to lower the barrier of entry for -newcomers to Qt Quick and Qt. The key features of Qt Creator allow UI designers -and developers to accomplish the following tasks: -\list -\li Get started with Qt Quick application development quickly and easily with -examples, tutorials, and project wizards. -\li Design application user interface with the integrated editor, Qt Quick -Designer, or use graphics software to design the user interface and use scripts -to export the design to Qt Quick Designer. -\li Develop applications with the advanced code editor that provides new powerful -features for completing code snippets, refactoring code, and viewing the object -hierarchy of QML files. -\li Build and deploy Qt Quick applications that target multiple desktop and -mobile platforms, such as Microsoft Windows, Mac OS X, Linux, and Maemo. -\li Debug JavaScript functions and execute JavaScript expressions in the current -context, and inspect QML at runtime to explore the object structure, debug -animations, and inspect colors. -\li Deploy applications to mobile devices and create application installation -packages for Maemo devices that can be published in the Ovi Store -and other channels. -\li Easily access information with the integrated context-sensitive Qt Help -system. -\endlist - -\image qtcreator-target-selector.png - -\section1 Where to Go from Here - -The \l{qtquick-applicationdevelopers.html}{QML Application Developer Resources} -page contains the most important information for QML application developers. - -\l{external: Developing Qt Quick Applications with Creator} -{Developing Qt Quick Applications with Creator} provides an overview -of user interface development using the visual \e{Qt Quick Designer} tool. - -The \l {QtQml}{Qt QML module} documentation contains in-depth -information about the QML language and the concepts behind QML. - -The \l {QtQuick}{Qt Quick module} documentation contains in-depth -information about the QML types and functionality provided by Qt Quick, -which forms the basis for user-interfaces developed in QML. - -The \l{qtquick-codesamples.html}{Qt Quick Code Samples} page has a gallery of QML applications. - -*/ |