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 URLs may contain encoded characters using the 'percent-encoding' scheme
171 specified by \l {http://tools.ietf.org/html/rfc3986}{RFC 3986}. These characters
172 will be preserved within properties of type \c url, to allow QML code to
173 construct precise URL values. An exception to this rule is the preemptive
174 decoding of directory-separator characters (\c '/') - these characters are decoded
175 to allow the URL to be correctly classified.
177 For example, a local file containing a '#' character, which would normally be
178 interpreted as the beginning of the URL 'fragment' element, can be accessed by
179 encoding the characters of the file name:
182 Image { source: encodeURIComponent("/tmp/test#1.png") }
185 \sa {QML Basic Types}
190 \ingroup qmlbasictypes
192 \brief A color is a standard color name in quotes.
194 A color is a standard color name in quotes. It is normally specified
195 as an \l {http://www.w3.org/TR/SVG/types.html#ColorKeywords} {SVG
196 color name}. These names include colors like "red", "green" and
199 If the color you want isn't part of this list, colors can also be
200 specified in hexidecimal triplets or quads that take the form \c
201 "#RRGGBB" and \c "#AARRGGBB" respectively. For example, the color
202 red corresponds to a triplet of \c "#FF0000" and a slightly
203 transparent blue to a quad of \c "#800000FF".
207 \inlineimage declarative-colors.png
210 \snippet qml/colors.qml colors
212 Or with the \l{QML:Qt::rgba()}{Qt.rgba()}, \l{QML:Qt::hsla()}{Qt.hsla()}, \l{QML:Qt::darker()}{Qt.darker()},
213 \l{QML:Qt::lighter()}{Qt.lighter()} or \l{QML:Qt::tint()}{Qt.tint()} functions:
216 Rectangle { color: Qt.rgba(0.5, 0.5, 0, 1) }
219 \sa {QML Basic Types}
224 \ingroup qmlbasictypes
226 \brief A point type has x and y attributes.
228 A \c point type has \c x and \c y attributes.
230 To create a \c point value, specify it as a "x,y" string:
233 CustomObject { myPointProperty: "0,20" }
236 Or use the \l{QML:Qt::point()}{Qt.point()} function:
239 CustomObject { myPointProperty: Qt.point(0, 20) }
242 \sa {QML Basic Types}
247 \ingroup qmlbasictypes
249 \brief A size type has width and height attributes
251 A \c size type has \c width and \c height attributes.
253 For example, to read the \l {Image::sourceSize} \c size property:
257 Image { id: image; source: "logo.png" }
258 Text { text: image.sourceSize.width + "," + image.sourceSize.height }
262 To create a \c size value, specify it as a "width x height" string:
265 LayoutItem { preferredSize: "150x50" }
268 Or use the \l{QML:Qt::size()}{Qt.size()} function:
271 LayoutItem { preferredSize: Qt.size(150, 50) }
274 \sa {QML Basic Types}
279 \ingroup qmlbasictypes
281 \brief A rect type has x, y, width and height attributes.
283 A \c rect type has \c x, \c y, \c width and \c height attributes.
285 For example, to read the \l {Item::childrenRect.x}{Item::childrenRect} \c rect property:
288 width: childrenRect.width
289 height: childrenRect.height
291 Rectangle { width: 100; height: 100 }
295 To create a \c rect value, specify it as a "x, y, width x height" string:
298 CustomObject { myRectProperty: "50,50,100x100" }
301 Or use the \l{QML:Qt::rect()}{Qt.rect()} function:
304 CustomObject { myRectProperty: Qt.rect(50, 50, 100, 100) }
307 \sa {QML Basic Types}
312 \ingroup qmlbasictypes
314 \brief A date is specified as "YYYY-MM-DD".
316 To create a \c date value, specify it as a "YYYY-MM-DD" string:
320 MyDatePicker { minDate: "2000-01-01"; maxDate: "2020-12-31" }
323 To read a date value returned from a C++ extension class, use
324 \l{QML:Qt::formatDate()}{Qt.formatDate()} and \l{QML:Qt::formatDateTime()}{Qt.formatDateTime()}.
326 \sa {QML Basic Types}
331 \ingroup qmlbasictypes
333 \brief A time is specified as "hh:mm:ss".
335 A time is specified as "hh:mm:ss".
339 MyTimePicker { time: "14:22:15" }
342 To read a time value returned from a C++ extension class, use
343 \l{QML:Qt::formatTime()}{Qt.formatTime()} and \l{QML:Qt::formatDateTime()}{Qt.formatDateTime()}.
345 Note that when converting historical times to and from javascript that QDateTime and the JS Date object
346 have different methods of calculating historical daylight savings time application. This can lead to variations of one hour
347 when converting to historical local time.
349 \sa {QML Basic Types}
354 \ingroup qmlbasictypes
356 \brief A font type has the properties of a QFont.
358 A font type has the properties of a QFont. The properties are:
361 \li \c string font.family
362 \li \c bool font.bold
363 \li \c bool font.italic
364 \li \c bool font.underline
365 \li \c real font.pointSize
366 \li \c int font.pixelSize
371 Text { font.family: "Helvetica"; font.pointSize: 13; font.bold: true }
374 \sa {QML Basic Types}
379 \ingroup qmlbasictypes
381 \brief The action type has all the properties of QAction.
383 The action type has all the properties of QAction. The properties
387 \li \c slot action.trigger - invoke the action
388 \li \c bool action.enabled - true if the action is enabled
389 \li \c string action.text - the text associated with the action
392 Actions are used like this:
396 MouseArea { onClicked: myaction.trigger() }
397 State { name: "enabled"; when: myaction.enabled == true }
398 Text { text: someaction.text }
402 \sa {QML Basic Types}
407 \ingroup qmlbasictypes
409 \brief A list of objects.
411 A list type contains a list of objects. While not technically
412 a basic type, QML supports lists of object types. When used
413 from QML, the engine automatically appends each value to the list.
414 Items in the list can be accessed by index using the usual
415 \c listName[index] syntax.
417 For example, the \l Item class contains a list property named
418 children that can be used like this:
424 Rectangle { id: child2; width: 200 },
428 Component.onCompleted: {
429 console.log("Width of child rectangle:", children[1].width)
433 \c child1, \c child2 and \c child3 will be added to the children list
434 in the order in which they appear.
436 List \l {Property Binding}{properties} can be created as a
437 \c variant type, or as a \c list<Type> type, where \c Type is the
438 type of the object in the list:
442 property list<Rectangle> rects: [
443 Rectangle { width: 100; height: 100},
444 Rectangle { width: 200; height: 200}
449 A list property can only contain values that match (or are derived from) the
452 While the \c rects property can be reassigned to a different list value (including
453 an empty list), its individual values cannot be modified. See the \l variant type
454 documentation for details.
456 \sa {QML Basic Types}
461 \ingroup qmlbasictypes
463 \brief A var type is a generic property type.
465 A var is a generic property type capable of storing any data type.
466 It is equivalent to a regular JavaScript variable.
467 For example, var properties can store numbers, strings, objects,
468 arrays and functions:
472 property var aNumber: 100
473 property var aBool: false
474 property var aString: "Hello world!"
475 property var anotherString: String("#FF008800")
476 property var aColor: Qt.rgba(0.2, 0.3, 0.4, 0.5)
477 property var aRect: Qt.rect(10, 10, 10, 10)
478 property var aPoint: Qt.point(10, 10)
479 property var aSize: Qt.size(10, 10)
480 property var aVector3d: Qt.vector3d(100, 100, 100)
481 property var anArray: [1, 2, 3, "four", "five", (function() { return "six"; })]
482 property var anObject: { "foo": 10, "bar": 20 }
483 property var aFunction: (function() { return "one"; })
487 It is important to note that changes in regular properties of JavaScript
488 objects assigned to a var property will \b{not} trigger updates of bindings
489 that access them. The example below will display "The car has 4 wheels" as
490 the change to the wheels property will not cause the reevaluation of the
491 binding assigned to the "text" property:
495 property var car: new Object({wheels: 4})
498 text: "The car has " + car.wheels + " wheels";
501 Component.onCompleted: {
507 If the onCompleted handler instead had \tt{"car = new Object({wheels: 6})"}
508 then the text would be updated to say "The car has 6 wheels"., since the
509 car property itself would be changed, which causes a change notification
512 A \c var type property can also hold an image or pixmap.
513 A \c var which contains a QPixmap or QImage is known as a
514 "scarce resource" and the declarative engine will attempt to
515 automatically release such resources after evaluation of any JavaScript
516 expression which requires one to be copied has completed.
518 Clients may explicitly release such a scarce resource by calling the
519 "destroy" method on the \c var property from within JavaScript. They
520 may also explicitly preserve the scarce resource by calling the
521 "preserve" method on the \c var property from within JavaScript.
522 For more information regarding the usage of a scarce resource, please
523 see \l{Scarce Resources in JavaScript}.
525 \sa {QML Basic Types}
531 \qmlbasictype variant
532 \ingroup qmlbasictypes
534 \brief A variant type is a generic property type.
536 A variant is a generic property type. It is obsolete and exists only to
537 support old applications; new applications should use "var" type
540 A variant type property can hold any of the \l {QML Basic Types}{basic type}
545 property variant aNumber: 100
546 property variant aString: "Hello world!"
547 property variant aBool: false
551 A \c variant type property can also hold an image or pixmap.
552 A \c variant which contains a QPixmap or QImage is known as a
553 "scarce resource" and the declarative engine will attempt to
554 automatically release such resources after evaluation of any JavaScript
555 expression which requires one to be copied has completed.
557 Clients may explicitly release such a scarce resource by calling the
558 "destroy" method on the \c variant property from within JavaScript. They
559 may also explicitly preserve the scarce resource by calling the
560 "preserve" method on the \c variant property from within JavaScript.
561 For more information regarding the usage of a scarce resource, please
562 see \l{Scarce Resources in JavaScript}.
564 Finally, the \c variant type can also hold:
567 \li An array of \l {QML Basic Types}{basic type} values
568 \li A map of key-value pairs with \l {QML Basic Types}{basic-type} values
571 For example, below is an \c items array and an \c attributes map. Their
572 contents can be examined using JavaScript \c for loops. Individual array
573 values are accessible by index, and individual map values are accessible
578 property variant items: [1, 2, 3, "four", "five"]
579 property variant attributes: { 'color': 'red', 'width': 100 }
581 Component.onCompleted: {
582 for (var i=0; i<items.length; i++)
583 console.log(items[i])
585 for (var prop in attributes)
586 console.log(prop, "=", attributes[prop])
591 While this is a convenient way to store array and map-type values, you
592 must be aware that the \c items and \c attributes properties above are \e not
593 QML objects (and certainly not JavaScript object either) and the key-value
594 pairs in \c attributes are \e not QML properties. Rather, the \c items
595 property holds an array of values, and \c attributes holds a set of key-value
596 pairs. Since they are stored as a set of values, instead of as an object,
597 their contents \e cannot be modified individually:
601 property variant items: [1, 2, 3, "four", "five"]
602 property variant attributes: { 'color': 'red', 'width': 100 }
604 Component.onCompleted: {
606 console.log(items[0]) // This will still be '1'!
607 attributes.color = 'blue'
608 console.log(attributes.color) // This will still be 'red'!
613 Additionally, since \c items and \c attributes are not QML objects, changing
614 their individual values do not trigger property change notifications. If
615 the above example had \c onNumberChanged or \c onAnimalChanged signal
616 handlers, they would not have been called. If, however, the \c items or
617 \c attributes properties themselves were reassigned to different values, then
618 such handlers would be called.
620 One way to "update" the contents of an array or map is to copy the property
621 to a JavaScript object, modify the copy as desired, and then reassign the
622 property to the updated copy. Note, however, that this is not efficient.
623 In the example below, which reassigns the \c attributes property, the \e entire
624 set of key-value pairs must be serialized and deserialized every time it is
625 copied between a JavaScript object and a QML property:
629 property variant attributes: { 'color': 'red', 'width': 100 }
631 Component.onCompleted: {
632 // Change the value of attributes.color to 'blue':
633 var temp = attributes // copy all values to 'temp'
635 attributes = temp // copy all values back to 'attributes'
640 Since this operation is inefficient, if a list or map should be modifiable,
641 it is better to use alternative approaches. For example, you could implement
642 a custom C++ list element, or write to a JavaScript object defined from
643 within a JavaScript file.
645 JavaScript programmers should also note that when a JavaScript object is
646 copied to an array or map property, the \e contents of the object (that is,
647 its key-value properties) are copied, rather than the object itself. The
648 property does not hold a reference to the original JavaScript object, and
649 extra data such as the object's JavaScript prototype chain is also lost in
652 \sa {QML Basic Types}
656 \qmlbasictype vector3d
657 \ingroup qmlbasictypes
659 \brief A vector3d type has x, y, and z attributes.
661 A \c vector3d type has \c x, \c y, and \c z attributes.
663 To create a \c vector3d value, specify it as a "x,y,z" string:
666 Rotation { angle: 60; axis: "0,1,0" }
669 or with the \l{QML:Qt::vector3d()}{Qt.vector3d()} function:
672 Rotation { angle: 60; axis: Qt.vector3d(0, 1, 0) }
675 or as separate \c x, \c y, and \c z components:
678 Rotation { angle: 60; axis.x: 0; axis.y: 1; axis.z: 0 }
681 \sa {QML Basic Types}
685 \qmlbasictype enumeration
686 \ingroup qmlbasictypes
688 \brief An enumeration type consists of a set of named values.
690 An enumeration type consists of a set of named values.
692 An enumeration value may be specified as either a string:
694 Text { horizontalAlignment: "AlignRight" }
697 or as \c {<Element>.<value>}:
699 Text { horizontalAlignment: Text.AlignRight }
702 The second form is preferred.
704 \sa {QML Basic Types}