7
+ − 1
/****************************************************************************
+ − 2
**
+ − 3
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ − 4
** All rights reserved.
+ − 5
** Contact: Nokia Corporation (qt-info@nokia.com)
+ − 6
**
+ − 7
** This file is part of the documentation of the Qt Toolkit.
+ − 8
**
+ − 9
** $QT_BEGIN_LICENSE:LGPL$
+ − 10
** No Commercial Usage
+ − 11
** This file contains pre-release code and may not be distributed.
+ − 12
** You may use this file in accordance with the terms and conditions
+ − 13
** contained in the Technology Preview License Agreement accompanying
+ − 14
** this package.
+ − 15
**
+ − 16
** GNU Lesser General Public License Usage
+ − 17
** Alternatively, this file may be used under the terms of the GNU Lesser
+ − 18
** General Public License version 2.1 as published by the Free Software
+ − 19
** Foundation and appearing in the file LICENSE.LGPL included in the
+ − 20
** packaging of this file. Please review the following information to
+ − 21
** ensure the GNU Lesser General Public License version 2.1 requirements
+ − 22
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ − 23
**
+ − 24
** In addition, as a special exception, Nokia gives you certain additional
+ − 25
** rights. These rights are described in the Nokia Qt LGPL Exception
+ − 26
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+ − 27
**
+ − 28
** If you have questions regarding the use of this file, please contact
+ − 29
** Nokia at qt-info@nokia.com.
+ − 30
**
+ − 31
**
+ − 32
**
+ − 33
**
+ − 34
**
+ − 35
**
+ − 36
**
+ − 37
**
+ − 38
** $QT_END_LICENSE$
+ − 39
**
+ − 40
****************************************************************************/
+ − 41
+ − 42
/*!
+ − 43
\page qtscriptextensions.html
+ − 44
\title Creating QtScript Extensions
+ − 45
\brief A guide to creating and using QtScript extensions.
+ − 46
+ − 47
QtScript extensions can make additional functionality available to scripts
+ − 48
evaluated by a QScriptEngine. Extensions are imported by calling
+ − 49
the QScriptEngine::importExtension() function.
+ − 50
+ − 51
There are three ways to create an extension:
+ − 52
+ − 53
\list
+ − 54
\o Subclass QScriptExtensionPlugin and implement the desired functionality.
+ − 55
\o Implement the functionality in a script file.
+ − 56
\o Use a hybrid approach, where part of the functionality is implemented in a
+ − 57
QScriptExtensionPlugin, and part is implemented in a script file.
+ − 58
\endlist
+ − 59
+ − 60
The (dot-qualified) extension name is used to determine the path (relative to
+ − 61
the application's plugin path) where QScriptEngine will look for the script
+ − 62
file that will initialize the extension; if a file called \c{__init__.js}
+ − 63
(usually located in \c{[application plugin path]/script/foo/}) is
+ − 64
found in the corresponding folder, its contents will be evaluated by the engine
+ − 65
when the extension is imported.
+ − 66
As an example, if the extension is called \c{"foo.bar.baz"}, the engine will look
+ − 67
for \c{__init__.js} in \c{foo/bar/baz}. Additionally, before importing
+ − 68
\c{"foo.bar.baz"}, the engine will ensure that the extensions \c{"foo"} and \c{"foo.bar"}
+ − 69
are imported, locating and evaluating the corresponding \c{__init__.js}
+ − 70
in the same manner (in folders \c{foo} and \c{foo/bar}, respectively).
+ − 71
+ − 72
The contents of \c{__init__.js} are evaluated in a new QScriptContext,
+ − 73
as if it were the body of a function. The engine's Global Object acts as
+ − 74
the \c{this} object. The following local variables are initially available
+ − 75
to the script:
+ − 76
+ − 77
\list
+ − 78
\o \bold{__extension__}: The name of the extension (e.g. \c{"foo.bar.baz"}).
+ − 79
\o \bold{__setupPackage__}: A convenience function for setting up a "namespace" in the script environment. A typical application is to call \c{__setupPackage__()} with \c{__extension__} as argument; e.g. \c{__setupPackage__("foo.bar.baz")} would ensure that the object chain represented by the expression \c{foo.bar.baz} exists in the script environment. (This function is semantically equivalent to QScriptExtensionPlugin::setupPackage().)
+ − 80
\o \bold{__postInit__}: By default, this variable is undefined. If you assign a function to it, that function will be called \bold{after} the C++ plugin's initialize() function has been called. You can use this to perform further initialization that depends on e.g. native functions that the C++ plugin registers.
+ − 81
\endlist
+ − 82
+ − 83
An example of a simple \c{__init__.js}:
+ − 84
+ − 85
\snippet doc/src/snippets/code/doc_src_qtscriptextensions.qdoc 0
+ − 86
+ − 87
QScriptEngine will look for a QScriptExtensionPlugin that provides
+ − 88
the relevant extension by querying each plugin for its keys()
+ − 89
until a match is found. The plugin's initialize() function will be
+ − 90
called \bold{after} the relevant \c{__init__.js} (if any) has been
+ − 91
evaluated.
+ − 92
+ − 93
Continuining with the example of our imaginary extension \c{"foo.bar.baz"},
+ − 94
the following steps will be performed by QScriptEngine::importExtension():
+ − 95
+ − 96
\list
+ − 97
\o If it exists, \c{foo/__init__.js} is evaluated.
+ − 98
\o If a plugin with \c{"foo"} in its list of keys is found, its initialize() function is called with \c{"foo"} as key.
+ − 99
\o If it exists, \c{foo/bar/__init__.js} is evaluated.
+ − 100
\o If a plugin with \c{"foo.bar"} in its list of keys is found, its initialize() function is called with \c{"foo.bar"} as key.
+ − 101
\o If it exists, \c{foo/bar/baz/__init__.js} is evaluated.
+ − 102
\o If a plugin with "foo.bar.baz" in its list of keys is found, its initialize() function is called with \c{"foo.bar.baz"} as key.
+ − 103
\endlist
+ − 104
+ − 105
\section1 Static Extensions
+ − 106
+ − 107
When an extension is compiled and linked into your application as a
+ − 108
static plugin, Qt Script will look for the optional \c{__init__.js}
+ − 109
script in a resource, prefixed by \c{:/qtscriptextension}. For example,
+ − 110
if the extension key is "foo.bar", Qt Script will evaluate the contents
+ − 111
of the file \c{:/qtscriptextension/foo/bar/__init__.js}, if it
+ − 112
exists. Note that if the resource is built into the plugin, you may
+ − 113
need to use the Q_INIT_RESOURCE() macro to initialize the resource
+ − 114
before importing the extension.
+ − 115
*/