/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** 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 The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/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: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
\page qml-glossary.html
\title Glossary Of QML Terms
\brief Glossary of terms used in the documentation for QML and Qt Quick

\section1 Common Terms

\table
    \header
        \li Term
        \li Definition

    \row
        \li QML
        \li The language in which QML applications are written. The language
            architecture and engine are implemented by the Qt QML module.

    \row
        \li Qt Quick
        \li The standard library of types and functionality for the
            QML language, which is provided by the Qt Quick module,
            and may be accessed with "import QtQuick 2.3".

    \row
        \li Type
        \li In QML, a \e type may refer to either a
            \l{qtqml-typesystem-topic.html}{Basic Type} or a
            \l{qtqml-typesystem-topic.html#qml-object-types}{QML Object Type}.

            The QML language provides a number of built-in
            \l{qtqml-typesystem-basictypes.html}{basic types}, and the
            Qt Quick module provides various \l {Qt Quick QML Types}{Qt Quick types}
            for building QML applications. Types can also be provided by
            third-party developers through (\l{qtqml-modules-topic.html}{modules}) or by the application
            developer in the application itself through \l{qtqml-documents-definetypes.html}{QML Documents}.

            See \l{qtqml-typesystem-topic.html}{The QML Type System}
            for more details.

    \row
        \li Basic Type
        \li A \l{qtqml-typesystem-topic.html}{basic type} is a simple type
            such as \c int, \c string and \c bool. Unlike
            \l{qtqml-typesystem-topic.html#qml-object-types}{object types},
            an object cannot be instantiated from a basic type; for example,
            it is not possible to create an \c int object with properties,
            methods, signals and so on.

            Basic types are built into the QML language, whereas object types
            cannot be used unless the appropriate
            \l{qtqml-modules-topic.html}{module} is imported.

            See \l{qtqml-typesystem-topic.html}{The QML Type System}
            for more details.

    \row
        \li Object Type
        \li A \l{qtqml-typesystem-topic.html#qml-object-types}{QML Object Type}
            is a type that can be instantiated by the QML engine.

            A QML type can be defined either by a document in a .qml file
            beginning with a capital letter, or by a QObject-based C++ class.

            See \l{qtqml-typesystem-topic.html}{The QML Type System}
            for more details.

    \row
        \li Object
        \li A QML object is an instance of a
            \l{qtqml-typesystem-topic.html#qml-object-types}{QML Object Type}.

            Such objects are created by the engine when it processes
            \l{qtqml-syntax-basics.html#object-declarations}{object declarations},
            which specify the objects to be created and the attributes that are to
            be defined for each object.

            Additionally, objects can be dynamically created at runtime through
            Component.createObject() and Qt.createQmlObject().

            See also \l{#lazy-instantiation}{Lazy Instantiation}.

    \row
        \li Component
        \li A component is a template from which a QML object or object
            tree is created. It is produced when a document is loaded by
            the QML engine. Once it has been loaded, it can be used to
            instantiate the object or object tree that it represents.

            Additionally, the \l Component type is a special type that can
            can be used to declare a component inline within a document.
            Component objects can also be dynamically created through
            Qt.createComponent() to dynamically create QML objects.

    \row
        \li Document
        \li A \l{qtqml-documents-topic.html}{QML Document} is a self
            contained piece of QML source code that begins with one or more
            import statements and contains a single top-level object
            declaration. A document may reside in a .qml file or a text string.

            If it is placed in a .qml file whose name begins with a capital
            letter, the file is recognized by the engine as a definition of
            a QML type. The top-level object declaration encapsulates the
            object tree that will be instantiated by the type.

    \row
        \li Property
        \li A property is an attribute of an object type that has a name and
            an associated value; this value can be read (and in most cases, also
            written to) externally.

            An object can have one or more properties.  Some properties
            are associated with the canvas (e.g., x, y, width, height,
            and opacity) while others may be data specific to that type
            (e.g., the "text" property of the \l Text type).

            See \l{qtqml-syntax-objectattributes.html}{QML Object Attributes}
            for more details.

    \row
        \li Binding
        \li A binding is a JavaScript expression which is "bound" to a
            property.  The value of the property at any point in time
            will be the value returned by evaluating that expression.

            See \l{qtqml-syntax-propertybinding.html}{Property Binding}
            for more details.

    \row
        \li Signal
        \li A signal is a notification from a QML object. When an object emits
            a signal, other objects can receive and process this signal through
            a \l{Signal Attributes}{signal handler}.

            Most properties of QML objects
            have a change signal, and also an associated change signal handler
            which may be defined by clients to implement functionality.  For
            example, the "onClicked()" handler of an instance of the MouseArea
            type might be defined in an application to cause a sound to be
            played.

            See \l{qtqml-syntax-signals.html}{Signal and Handler Event System}
            for more details.

    \row
        \li Signal Handler
        \li A signal handler is the expression (or function) which is triggered
            by a signal.  It is also known as a "slot" in C++.

            See \l{qtqml-syntax-signals.html}{Signal and Handler Event System}
            for more details.

    \row
        \target lazy-instantiation
        \li Lazy Instantiation
        \li Object instances can be instantiated "lazily" at run-time,
            to avoid performing unnecessary work until needed.  Qt Quick
            provides the \l Loader type to make lazy instantiation more
            convenient.
\endtable
*/
