1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the documentation of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:FDL$
9 ** GNU Free Documentation License
10 ** Alternatively, this file may be used under the terms of the GNU Free
11 ** Documentation License version 1.3 as published by the Free Software
12 ** Foundation and appearing in the file included in the packaging of
16 ** Alternatively, this file may be used in accordance with the terms
17 ** and conditions contained in a signed written agreement between you
26 ****************************************************************************/
28 \page qtqml-basictypes.html
29 \title QML Basic Types
30 \brief Description of basic types provided by the Qt QML module
33 A \e{basic type} is one that refers to a simple value, as opposed to a QML object with properties, signals, methods and so on.
35 Basic types can be used to refer to:
38 \li A single value (e.g. \l int refers to a single number, \l var can refer to a single list of items)
39 \li A value that contains a simple set of property-value pairs (e.g. \l size refers to a value with \c width and \c height attributes)
42 Unlike a QML type, a basic type cannot be used for QML object definitions. It is not possible, for example, to declare an \c int{} object or a \c size{} object.
44 See \l {QML Basic Types} for the list of basic types that are supported by the QML engine. Basic types are supported by the engine by default and do not require an \l {Import Statements}{Import Statements} to be used, unlike QML types.
48 \annotatedlist qmlbasictypes
50 To create additional types, such as data types created in C++, read the
51 \l{Defining QML Object Types from C++} article.
56 \ingroup qmlbasictypes
58 \brief An integer is a whole number, e.g. 0, 10, or -20.
60 An integer is a whole number, e.g. 0, 10, or -20. The possible \c
61 int values range from around -2000000000 to around 2000000000,
62 although most elements will only accept a reduced range (which they
63 mention in their documentation).
67 Item { width: 100; height: 200 }
75 \ingroup qmlbasictypes
77 \brief A boolean is a binary true/false value.
79 A boolean is a binary true/false value.
83 Item { focus: true; clip: false }
91 \ingroup qmlbasictypes
93 \brief A real number has a decimal point, e.g. 1.2 or -29.8.
95 A real number has a decimal point, e.g. 1.2 or -29.8.
99 Item { width: 100.45; height: 150.82 }
102 \b{Note:} In QML all reals are stored in double precision, \l
103 {http://en.wikipedia.org/wiki/IEEE_754} {IEEE floating point}
106 \sa {QML Basic Types}
111 \ingroup qmlbasictypes
113 \brief A double number has a decimal point and is stored in double precision.
115 A double number has a decimal point and is stored in double precision, \l
116 {http://en.wikipedia.org/wiki/IEEE_754} {IEEE floating point}
122 property double number: 32155.2355
126 \sa {QML Basic Types}
131 \ingroup qmlbasictypes
133 \brief A string is a free form text in quotes, e.g. "Hello world!".
135 A string is a free form text in quotes, e.g. "Hello world!".
139 Text { text: "Hello world!" }
142 Strings have a \c length attribute that holds the number of
143 characters in the string.
145 \sa {QML Basic Types}
150 \ingroup qmlbasictypes
152 \brief A URL is a resource locator, like a file name.
154 A URL is a resource locator, like a file name. It can be either
155 absolute, e.g. "http://qt.nokia.com", or relative, e.g.
156 "pics/logo.png". A relative URL is resolved relative to the URL of
157 the component where the URL is converted from a JavaScript string
158 expression to a url property value.
162 Image { source: "pics/logo.png" }
165 Note that as QML requires URL paths, you should use "qrc:///" instead of ":/" for
166 referring to files stored with the \l {Qt Resource System}.
167 Usually you will only have to do this once, because relative URLs resolved from
168 that file will use the same protocol.
170 \sa {QML Basic Types}
175 \ingroup qmlbasictypes
177 \brief A color is a standard color name in quotes.
179 A color is a standard color name in quotes. It is normally specified
180 as an \l {http://www.w3.org/TR/SVG/types.html#ColorKeywords} {SVG
181 color name}. These names include colors like "red", "green" and
184 If the color you want isn't part of this list, colors can also be
185 specified in hexidecimal triplets or quads that take the form \c
186 "#RRGGBB" and \c "#AARRGGBB" respectively. For example, the color
187 red corresponds to a triplet of \c "#FF0000" and a slightly
188 transparent blue to a quad of \c "#800000FF".
192 \inlineimage declarative-colors.png
195 \snippet qml/colors.qml colors
197 Or with the \l{QML:Qt::rgba()}{Qt.rgba()}, \l{QML:Qt::hsla()}{Qt.hsla()}, \l{QML:Qt::darker()}{Qt.darker()},
198 \l{QML:Qt::lighter()}{Qt.lighter()} or \l{QML:Qt::tint()}{Qt.tint()} functions:
201 Rectangle { color: Qt.rgba(0.5, 0.5, 0, 1) }
204 \sa {QML Basic Types}
209 \ingroup qmlbasictypes
211 \brief A point type has x and y attributes.
213 A \c point type has \c x and \c y attributes.
215 To create a \c point value, specify it as a "x,y" string:
218 CustomObject { myPointProperty: "0,20" }
221 Or use the \l{QML:Qt::point()}{Qt.point()} function:
224 CustomObject { myPointProperty: Qt.point(0, 20) }
227 \sa {QML Basic Types}
232 \ingroup qmlbasictypes
234 \brief A size type has width and height attributes
236 A \c size type has \c width and \c height attributes.
238 For example, to read the \l {Image::sourceSize} \c size property:
242 Image { id: image; source: "logo.png" }
243 Text { text: image.sourceSize.width + "," + image.sourceSize.height }
247 To create a \c size value, specify it as a "width x height" string:
250 LayoutItem { preferredSize: "150x50" }
253 Or use the \l{QML:Qt::size()}{Qt.size()} function:
256 LayoutItem { preferredSize: Qt.size(150, 50) }
259 \sa {QML Basic Types}
264 \ingroup qmlbasictypes
266 \brief A rect type has x, y, width and height attributes.
268 A \c rect type has \c x, \c y, \c width and \c height attributes.
270 For example, to read the \l {Item::childrenRect.x}{Item::childrenRect} \c rect property:
273 width: childrenRect.width
274 height: childrenRect.height
276 Rectangle { width: 100; height: 100 }
280 To create a \c rect value, specify it as a "x, y, width x height" string:
283 CustomObject { myRectProperty: "50,50,100x100" }
286 Or use the \l{QML:Qt::rect()}{Qt.rect()} function:
289 CustomObject { myRectProperty: Qt.rect(50, 50, 100, 100) }
292 \sa {QML Basic Types}
297 \ingroup qmlbasictypes
299 \brief A date is specified as "YYYY-MM-DD".
301 To create a \c date value, specify it as a "YYYY-MM-DD" string:
305 MyDatePicker { minDate: "2000-01-01"; maxDate: "2020-12-31" }
308 To read a date value returned from a C++ extension class, use
309 \l{QML:Qt::formatDate()}{Qt.formatDate()} and \l{QML:Qt::formatDateTime()}{Qt.formatDateTime()}.
311 \sa {QML Basic Types}
316 \ingroup qmlbasictypes
318 \brief A time is specified as "hh:mm:ss".
320 A time is specified as "hh:mm:ss".
324 MyTimePicker { time: "14:22:15" }
327 To read a time value returned from a C++ extension class, use
328 \l{QML:Qt::formatTime()}{Qt.formatTime()} and \l{QML:Qt::formatDateTime()}{Qt.formatDateTime()}.
330 Note that when converting historical times to and from javascript that QDateTime and the JS Date object
331 have different methods of calculating historical daylight savings time application. This can lead to variations of one hour
332 when converting to historical local time.
334 \sa {QML Basic Types}
339 \ingroup qmlbasictypes
341 \brief A font type has the properties of a QFont.
343 A font type has the properties of a QFont. The properties are:
346 \li \c string font.family
347 \li \c bool font.bold
348 \li \c bool font.italic
349 \li \c bool font.underline
350 \li \c real font.pointSize
351 \li \c int font.pixelSize
356 Text { font.family: "Helvetica"; font.pointSize: 13; font.bold: true }
359 \sa {QML Basic Types}
364 \ingroup qmlbasictypes
366 \brief The action type has all the properties of QAction.
368 The action type has all the properties of QAction. The properties
372 \li \c slot action.trigger - invoke the action
373 \li \c bool action.enabled - true if the action is enabled
374 \li \c string action.text - the text associated with the action
377 Actions are used like this:
381 MouseArea { onClicked: myaction.trigger() }
382 State { name: "enabled"; when: myaction.enabled == true }
383 Text { text: someaction.text }
387 \sa {QML Basic Types}
392 \ingroup qmlbasictypes
394 \brief A list of objects.
396 A list type contains a list of objects. While not technically
397 a basic type, QML supports lists of object types. When used
398 from QML, the engine automatically appends each value to the list.
399 Items in the list can be accessed by index using the usual
400 \c listName[index] syntax.
402 For example, the \l Item class contains a list property named
403 children that can be used like this:
409 Rectangle { id: child2; width: 200 },
413 Component.onCompleted: {
414 console.log("Width of child rectangle:", children[1].width)
418 \c child1, \c child2 and \c child3 will be added to the children list
419 in the order in which they appear.
421 List \l {Property Binding}{properties} can be created as a
422 \c variant type, or as a \c list<Type> type, where \c Type is the
423 type of the object in the list:
427 property list<Rectangle> rects: [
428 Rectangle { width: 100; height: 100},
429 Rectangle { width: 200; height: 200}
434 A list property can only contain values that match (or are derived from) the
437 While the \c rects property can be reassigned to a different list value (including
438 an empty list), its individual values cannot be modified. See the \l variant type
439 documentation for details.
441 \sa {QML Basic Types}
446 \ingroup qmlbasictypes
448 \brief A var type is a generic property type.
450 A var is a generic property type capable of storing any data type.
451 It is equivalent to a regular JavaScript variable.
452 For example, var properties can store numbers, strings, objects,
453 arrays and functions:
457 property var aNumber: 100
458 property var aBool: false
459 property var aString: "Hello world!"
460 property var anotherString: String("#FF008800")
461 property var aColor: Qt.rgba(0.2, 0.3, 0.4, 0.5)
462 property var aRect: Qt.rect(10, 10, 10, 10)
463 property var aPoint: Qt.point(10, 10)
464 property var aSize: Qt.size(10, 10)
465 property var aVector3d: Qt.vector3d(100, 100, 100)
466 property var anArray: [1, 2, 3, "four", "five", (function() { return "six"; })]
467 property var anObject: { "foo": 10, "bar": 20 }
468 property var aFunction: (function() { return "one"; })
472 It is important to note that changes in regular properties of JavaScript
473 objects assigned to a var property will \b{not} trigger updates of bindings
474 that access them. The example below will display "The car has 4 wheels" as
475 the change to the wheels property will not cause the reevaluation of the
476 binding assigned to the "text" property:
480 property var car: new Object({wheels: 4})
483 text: "The car has " + car.wheels + " wheels";
486 Component.onCompleted: {
492 If the onCompleted handler instead had \tt{"car = new Object({wheels: 6})"}
493 then the text would be updated to say "The car has 6 wheels"., since the
494 car property itself would be changed, which causes a change notification
497 A \c var type property can also hold an image or pixmap.
498 A \c var which contains a QPixmap or QImage is known as a
499 "scarce resource" and the declarative engine will attempt to
500 automatically release such resources after evaluation of any JavaScript
501 expression which requires one to be copied has completed.
503 Clients may explicitly release such a scarce resource by calling the
504 "destroy" method on the \c var property from within JavaScript. They
505 may also explicitly preserve the scarce resource by calling the
506 "preserve" method on the \c var property from within JavaScript.
507 For more information regarding the usage of a scarce resource, please
508 see \l{Scarce Resources in JavaScript}.
510 \sa {QML Basic Types}
516 \qmlbasictype variant
517 \ingroup qmlbasictypes
519 \brief A variant type is a generic property type.
521 A variant is a generic property type. It is obsolete and exists only to
522 support old applications; new applications should use "var" type
525 A variant type property can hold any of the \l {QML Basic Types}{basic type}
530 property variant aNumber: 100
531 property variant aString: "Hello world!"
532 property variant aBool: false
536 A \c variant type property can also hold an image or pixmap.
537 A \c variant which contains a QPixmap or QImage is known as a
538 "scarce resource" and the declarative engine will attempt to
539 automatically release such resources after evaluation of any JavaScript
540 expression which requires one to be copied has completed.
542 Clients may explicitly release such a scarce resource by calling the
543 "destroy" method on the \c variant property from within JavaScript. They
544 may also explicitly preserve the scarce resource by calling the
545 "preserve" method on the \c variant property from within JavaScript.
546 For more information regarding the usage of a scarce resource, please
547 see \l{Scarce Resources in JavaScript}.
549 Finally, the \c variant type can also hold:
552 \li An array of \l {QML Basic Types}{basic type} values
553 \li A map of key-value pairs with \l {QML Basic Types}{basic-type} values
556 For example, below is an \c items array and an \c attributes map. Their
557 contents can be examined using JavaScript \c for loops. Individual array
558 values are accessible by index, and individual map values are accessible
563 property variant items: [1, 2, 3, "four", "five"]
564 property variant attributes: { 'color': 'red', 'width': 100 }
566 Component.onCompleted: {
567 for (var i=0; i<items.length; i++)
568 console.log(items[i])
570 for (var prop in attributes)
571 console.log(prop, "=", attributes[prop])
576 While this is a convenient way to store array and map-type values, you
577 must be aware that the \c items and \c attributes properties above are \e not
578 QML objects (and certainly not JavaScript object either) and the key-value
579 pairs in \c attributes are \e not QML properties. Rather, the \c items
580 property holds an array of values, and \c attributes holds a set of key-value
581 pairs. Since they are stored as a set of values, instead of as an object,
582 their contents \e cannot be modified individually:
586 property variant items: [1, 2, 3, "four", "five"]
587 property variant attributes: { 'color': 'red', 'width': 100 }
589 Component.onCompleted: {
591 console.log(items[0]) // This will still be '1'!
592 attributes.color = 'blue'
593 console.log(attributes.color) // This will still be 'red'!
598 Additionally, since \c items and \c attributes are not QML objects, changing
599 their individual values do not trigger property change notifications. If
600 the above example had \c onNumberChanged or \c onAnimalChanged signal
601 handlers, they would not have been called. If, however, the \c items or
602 \c attributes properties themselves were reassigned to different values, then
603 such handlers would be called.
605 One way to "update" the contents of an array or map is to copy the property
606 to a JavaScript object, modify the copy as desired, and then reassign the
607 property to the updated copy. Note, however, that this is not efficient.
608 In the example below, which reassigns the \c attributes property, the \e entire
609 set of key-value pairs must be serialized and deserialized every time it is
610 copied between a JavaScript object and a QML property:
614 property variant attributes: { 'color': 'red', 'width': 100 }
616 Component.onCompleted: {
617 // Change the value of attributes.color to 'blue':
618 var temp = attributes // copy all values to 'temp'
620 attributes = temp // copy all values back to 'attributes'
625 Since this operation is inefficient, if a list or map should be modifiable,
626 it is better to use alternative approaches. For example, you could implement
627 a custom C++ list element, or write to a JavaScript object defined from
628 within a JavaScript file.
630 JavaScript programmers should also note that when a JavaScript object is
631 copied to an array or map property, the \e contents of the object (that is,
632 its key-value properties) are copied, rather than the object itself. The
633 property does not hold a reference to the original JavaScript object, and
634 extra data such as the object's JavaScript prototype chain is also lost in
637 \sa {QML Basic Types}
641 \qmlbasictype vector3d
642 \ingroup qmlbasictypes
644 \brief A vector3d type has x, y, and z attributes.
646 A \c vector3d type has \c x, \c y, and \c z attributes.
648 To create a \c vector3d value, specify it as a "x,y,z" string:
651 Rotation { angle: 60; axis: "0,1,0" }
654 or with the \l{QML:Qt::vector3d()}{Qt.vector3d()} function:
657 Rotation { angle: 60; axis: Qt.vector3d(0, 1, 0) }
660 or as separate \c x, \c y, and \c z components:
663 Rotation { angle: 60; axis.x: 0; axis.y: 1; axis.z: 0 }
666 \sa {QML Basic Types}
670 \qmlbasictype enumeration
671 \ingroup qmlbasictypes
673 \brief An enumeration type consists of a set of named values.
675 An enumeration type consists of a set of named values.
677 An enumeration value may be specified as either a string:
679 Text { horizontalAlignment: "AlignRight" }
682 or as \c {<Element>.<value>}:
684 Text { horizontalAlignment: Text.AlignRight }
687 The second form is preferred.
689 \sa {QML Basic Types}