doc/src/snippets/code/doc_src_qtscript.qdoc
branchRCL_3
changeset 7 3f74d0d4af4c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/src/snippets/code/doc_src_qtscript.qdoc	Thu Apr 08 14:19:33 2010 +0300
@@ -0,0 +1,989 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//! [0]
+#include <QtScript>
+//! [0]
+
+
+//! [1]
+QT += script
+//! [1]
+
+
+//! [2]
+function myInterestingScriptFunction() { ... }
+...
+myQObject.somethingChanged.connect(myInterestingScriptFunction);
+//! [2]
+
+
+//! [3]
+myQObject.somethingChanged.connect(myOtherQObject.doSomething);
+//! [3]
+
+
+//! [4]
+myQObject.somethingChanged.disconnect(myInterestingFunction);
+myQObject.somethingChanged.disconnect(myOtherQObject.doSomething);
+//! [4]
+
+
+//! [5]
+var obj = { x: 123 };
+var fun = function() { print(this.x); };
+myQObject.somethingChanged.connect(obj, fun);
+//! [5]
+
+
+//! [6]
+myQObject.somethingChanged.disconnect(obj, fun);
+//! [6]
+
+
+//! [7]
+var obj = { x: 123, fun: function() { print(this.x); } };
+myQObject.somethingChanged.connect(obj, "fun");
+//! [7]
+
+
+//! [8]
+myQObject.somethingChanged.disconnect(obj, "fun");
+//! [8]
+
+
+//! [9]
+try {
+    myQObject.somethingChanged.connect(myQObject, "slotThatDoesntExist");
+} catch (e) {
+    print(e);
+}
+//! [9]
+
+
+//! [10]
+myQObject.somethingChanged("hello");
+//! [10]
+
+
+//! [11]
+myQObject.myOverloadedSlot(10);   // will call the int overload
+myQObject.myOverloadedSlot("10"); // will call the QString overload
+//! [11]
+
+
+//! [12]
+myQObject['myOverloadedSlot(int)']("10");   // call int overload; the argument is converted to an int
+myQObject['myOverloadedSlot(QString)'](10); // call QString overload; the argument is converted to a string
+//! [12]
+
+
+//! [13]
+Q_PROPERTY(bool enabled READ enabled WRITE setEnabled)
+//! [13]
+
+
+//! [14]
+myQObject.enabled = true;
+
+...
+
+myQObject.enabled = !myQObject.enabled;
+//! [14]
+
+
+//! [15]
+myDialog.okButton
+//! [15]
+
+
+//! [16]
+myDialog.okButton.objectName = "cancelButton";
+// from now on, myDialog.cancelButton references the button
+//! [16]
+
+
+//! [17]
+var okButton = myDialog.findChild("okButton");
+if (okButton != null) {
+   // do something with the OK button
+}
+
+var buttons = myDialog.findChildren(RegExp("button[0-9]+"));
+for (var i = 0; i < buttons.length; ++i) {
+   // do something with buttons[i]
+}
+//! [17]
+
+
+//! [18]
+QScriptValue myQObjectConstructor(QScriptContext *context, QScriptEngine *engine)
+{
+  // let the engine manage the new object's lifetime.
+  return engine->newQObject(new MyQObject(), QScriptEngine::ScriptOwnership);
+}
+//! [18]
+
+
+//! [19]
+class MyObject : public QObject
+{
+    Q_OBJECT
+
+public:
+    MyObject( ... );
+
+    void aNonScriptableFunction();
+
+public slots: // these functions (slots) will be available in QtScript
+    void calculate( ... );
+    void setEnabled( bool enabled );
+    bool isEnabled() const;
+
+private:
+   ....
+
+};
+//! [19]
+
+
+//! [20]
+class MyObject : public QObject
+{
+    Q_OBJECT
+
+    public:
+    Q_INVOKABLE void thisMethodIsInvokableInQtScript();
+    void thisMethodIsNotInvokableInQtScript();
+
+    ...
+};
+//! [20]
+
+
+//! [21]
+var obj = new MyObject;
+obj.setEnabled( true );
+print( "obj is enabled: " + obj.isEnabled() );
+//! [21]
+
+
+//! [22]
+var obj = new MyObject;
+obj.enabled = true;
+print( "obj is enabled: " + obj.enabled );
+//! [22]
+
+
+//! [23]
+class MyObject : public QObject
+{
+    Q_OBJECT
+    // define the enabled property
+    Q_PROPERTY( bool enabled WRITE setEnabled READ isEnabled )
+
+public:
+    MyObject( ... );
+
+    void aNonScriptableFunction();
+
+public slots: // these functions (slots) will be available in QtScript
+    void calculate( ... );
+    void setEnabled( bool enabled );
+    bool isEnabled() const;
+
+private:
+   ....
+
+};
+//! [23]
+
+
+//! [24]
+Q_PROPERTY(int nonScriptableProperty READ foo WRITE bar SCRIPTABLE false)
+//! [24]
+
+
+//! [25]
+class MyObject : public QObject
+{
+    Q_OBJECT
+    // define the enabled property
+    Q_PROPERTY( bool enabled WRITE setEnabled READ isEnabled )
+
+public:
+    MyObject( ... );
+
+    void aNonScriptableFunction();
+
+public slots: // these functions (slots) will be available in QtScript
+    void calculate( ... );
+    void setEnabled( bool enabled );
+    bool isEnabled() const;
+
+signals: // the signals
+    void enabledChanged( bool newState );
+
+private:
+   ....
+
+};
+//! [25]
+
+
+//! [26]
+function enabledChangedHandler( b )
+{
+    print( "state changed to: " + b );
+}
+
+function init()
+{
+    var obj = new MyObject();
+    // connect a script function to the signal
+    obj["enabledChanged(bool)"].connect(enabledChangedHandler);
+    obj.enabled = true;
+    print( "obj is enabled: " + obj.enabled );
+}
+//! [26]
+
+
+//! [27]
+var o = new Object();
+o.foo = 123;
+print(o.hasOwnProperty('foo')); // true
+print(o.hasOwnProperty('bar')); // false
+print(o); // calls o.toString(), which returns "[object Object]"
+//! [27]
+
+
+//! [28]
+function Person(name)
+{
+  this.name = name;
+}
+//! [28]
+
+
+//! [29]
+Person.prototype.toString = function() { return "Person(name: " + this.name + ")"; }
+//! [29]
+
+
+//! [30]
+var p1 = new Person("John Doe");
+var p2 = new Person("G.I. Jane");
+print(p1); // "Person(name: John Doe)"
+print(p2); // "Person(name: G.I. Jane)"
+//! [30]
+
+
+//! [31]
+print(p1.hasOwnProperty('name')); // 'name' is an instance variable, so this returns true
+print(p1.hasOwnProperty('toString')); // returns false; inherited from prototype
+print(p1 instanceof Person); // true
+print(p1 instanceof Object); // true
+//! [31]
+
+
+//! [32]
+function Employee(name, salary)
+{
+  Person.call(this, name); // call base constructor
+
+  this.salary = salary;
+}
+
+// set the prototype to be an instance of the base class
+Employee.prototype = new Person();
+
+// initialize prototype
+Employee.prototype.toString = function() { ... }
+//! [32]
+
+
+//! [33]
+var e = new Employee("Johnny Bravo", 5000000);
+print(e instanceof Employee); // true
+print(e instanceof Person);   // true
+print(e instanceof Object);   // true
+print(e instanceof Array);    // false
+//! [33]
+
+
+//! [34]
+QScriptValue Person_ctor(QScriptContext *context, QScriptEngine *engine)
+{
+  QString name = context->argument(0).toString();
+  context->thisObject().setProperty("name", name);
+  return engine->undefinedValue();
+}
+//! [34]
+
+
+//! [35]
+QScriptValue Person_prototype_toString(QScriptContext *context, QScriptEngine *engine)
+{
+  QString name = context->thisObject().property("name").toString();
+  QString result = QString::fromLatin1("Person(name: %0)").arg(name);
+  return result;
+}
+//! [35]
+
+
+//! [36]
+QScriptEngine engine;
+QScriptValue ctor = engine.newFunction(Person_ctor);
+ctor.property("prototype").setProperty("toString", engine.newFunction(Person_prototype_toString));
+QScriptValue global = engine.globalObject();
+global.setProperty("Person", ctor);
+//! [36]
+
+
+//! [37]
+QScriptValue Employee_ctor(QScriptContext *context, QScriptEngine *engine)
+{
+  QScriptValue super = context->callee().property("prototype").property("constructor");
+  super.call(context->thisObject(), QScriptValueList() << context->argument(0));
+  context->thisObject().setProperty("salary", context->argument(1));
+  return engine->undefinedValue();
+}
+//! [37]
+
+
+//! [38]
+QScriptValue empCtor = engine.newFunction(Employee_ctor);
+empCtor.setProperty("prototype", global.property("Person").construct());
+global.setProperty("Employee", empCtor);
+//! [38]
+
+
+//! [39]
+Q_DECLARE_METATYPE(QPointF)
+Q_DECLARE_METATYPE(QPointF*)
+
+QScriptValue QPointF_prototype_x(QScriptContext *context, QScriptEngine *engine)
+{
+  // Since the point is not to be modified, it's OK to cast to a value here
+    QPointF point = qscriptvalue_cast<QPointF>(context->thisObject());
+    return point.x();
+}
+
+QScriptValue QPointF_prototype_setX(QScriptContext *context, QScriptEngine *engine)
+{
+    // Cast to a pointer to be able to modify the underlying C++ value
+    QPointF *point = qscriptvalue_cast<QPointF*>(context->thisObject());
+    if (!point)
+        return context->throwError(QScriptContext::TypeError, "QPointF.prototype.setX: this object is not a QPointF");
+    point->setX(context->argument(0).toNumber());
+    return engine->undefinedValue();
+}
+//! [39]
+
+
+//! [40]
+var o = new Object();
+(o.__proto__ === Object.prototype); // this evaluates to true
+//! [40]
+
+
+//! [41]
+var o = new Object();
+o.__defineGetter__("x", function() { return 123; });
+var y = o.x; // 123
+//! [41]
+
+
+//! [42]
+var o = new Object();
+o.__defineSetter__("x", function(v) { print("and the value is:", v); });
+o.x = 123; // will print "and the value is: 123"
+//! [42]
+
+
+//! [43]
+class MyObject : public QObject
+{
+    Q_OBJECT
+    ...
+};
+
+Q_DECLARE_METATYPE(MyObject*)
+
+QScriptValue myObjectToScriptValue(QScriptEngine *engine, MyObject* const &in)
+{ return engine->newQObject(in); }
+
+void myObjectFromScriptValue(const QScriptValue &object, MyObject* &out)
+{ out = qobject_cast<MyObject*>(object.toQObject()); }
+
+...
+
+qScriptRegisterMetaType(&engine, myObjectToScriptValue, myObjectFromScriptValue);
+//! [43]
+
+//! [44]
+QScriptValue QPoint_ctor(QScriptContext *context, QScriptEngine *engine)
+{
+    int x = context->argument(0).toInt32();
+    int y = context->argument(1).toInt32();
+    return engine->toScriptValue(QPoint(x, y));
+}
+
+...
+
+engine.globalObject().setProperty("QPoint", engine.newFunction(QPoint_ctor));
+//! [44]
+
+//! [45]
+QScriptValue myPrintFunction(QScriptContext *context, QScriptEngine *engine)
+{
+    QString result;
+    for (int i = 0; i < context->argumentCount(); ++i) {
+        if (i > 0)
+            result.append(" ");
+        result.append(context->argument(i).toString());
+    }
+
+    QScriptValue calleeData = context->callee().data();
+    QPlainTextEdit *edit = qobject_cast<QPlainTextEdit*>(calleeData.toQObject());
+    edit->appendPlainText(result);
+
+    return engine->undefinedValue();
+}
+//! [45]
+
+//! [46]
+int main(int argc, char **argv)
+{
+    QApplication app(argc, argv);
+
+    QScriptEngine eng;
+    QPlainTextEdit edit;
+
+    QScriptValue fun = eng.newFunction(myPrintFunction);
+    fun.setData(eng.newQObject(&edit));
+    eng.globalObject().setProperty("print", fun);
+
+    eng.evaluate("print('hello', 'world')");
+
+    edit.show();
+    return app.exec();
+}
+//! [46]
+
+
+//! [47]
+QScriptEngine eng;
+QLineEdit *edit = new QLineEdit(...);
+QScriptValue handler = eng.evaluate("(function(text) { print('text was changed to', text); })");
+qScriptConnect(edit, SIGNAL(textChanged(const QString &)), QScriptValue(), handler);
+//! [47]
+
+//! [48]
+QLineEdit *edit1 = new QLineEdit(...);
+QLineEdit *edit2 = new QLineEdit(...);
+
+QScriptValue handler = eng.evaluate("(function() { print('I am', this.name); })");
+QScriptValue obj1 = eng.newObject();
+obj1.setProperty("name", "the walrus");
+QScriptValue obj2 = eng.newObject();
+obj2.setProperty("name", "Sam");
+
+qScriptConnect(edit1, SIGNAL(returnPressed()), obj1, handler);
+qScriptConnect(edit2, SIGNAL(returnPressed()), obj2, handler);
+//! [48]
+
+//! [49]
+var getProperty = function(name) { return this[name]; };
+
+name = "Global Object"; // creates a global variable
+print(getProperty("name")); // "Global Object"
+
+var myObject = { name: 'My Object' };
+print(getProperty.call(myObject, "name")); // "My Object"
+
+myObject.getProperty = getProperty;
+print(myObject.getProperty("name")); // "My Object"
+
+getProperty.name = "The getProperty() function";
+getProperty.getProperty = getProperty;
+getProperty.getProperty("name"); // "The getProperty() function"
+//! [49]
+
+//! [50]
+var o = { a: 1, b: 2, sum: function() { return a + b; } };
+print(o.sum()); // reference error, or sum of global variables a and b!!
+//! [50]
+
+//! [51]
+var o = { a: 1, b: 2, sum: function() { return this.a + this.b; } };
+print(o.sum()); // 3
+//! [51]
+
+//! [52]
+QScriptValue getProperty(QScriptContext *ctx, QScriptEngine *eng)
+{
+    QString name = ctx->argument(0).toString();
+    return ctx->thisObject().property(name);
+}
+//! [52]
+
+//! [53]
+QScriptValue myCompare(QScriptContext *ctx, QScriptEngine *eng)
+{
+    double first = ctx->argument(0).toNumber();
+    double second = ctx->argument(1).toNumber();
+    int result;
+    if (first == second)
+        result = 0;
+    else if (first < second)
+        result = -1;
+    else
+        result = 1;
+    return result;
+}
+//! [53]
+
+//! [54]
+QScriptEngine eng;
+QScriptValue comparefn = eng.newFunction(myCompare);
+QScriptValue array = eng.evaluate("new Array(10, 5, 20, 15, 30)");
+array.property("sort").call(array, QScriptValueList() << comparefn);
+
+// prints "5,10,15,20,30"
+qDebug() << array.toString();
+//! [54]
+
+//! [55]
+QScriptValue rectifier(QScriptContext *ctx, QScriptEngine *eng)
+{
+    QRectF magicRect = qscriptvalue_cast<QRectF>(ctx->callee().data());
+    QRectF sourceRect = qscriptvalue_cast<QRectF>(ctx->argument(0));
+    return eng->toScriptValue(sourceRect.intersected(magicRect));
+}
+
+...
+
+QScriptValue fun = eng.newFunction(rectifier);
+QRectF magicRect = QRectF(10, 20, 30, 40);
+fun.setData(eng.toScriptValue(magicRect));
+eng.globalObject().setProperty("rectifier", fun);
+//! [55]
+
+//! [56]
+function add(a, b) {
+    return a + b;
+}
+//! [56]
+
+//! [57]
+function add() {
+    return arguments[0] + arguments[1];
+}
+//! [57]
+
+//! [58]
+QScriptValue add(QScriptContext *ctx, QScriptEngine *eng)
+{
+    double a = ctx->argument(0).toNumber();
+    double b = ctx->argument(1).toNumber();
+    return a + b;
+}
+//! [58]
+
+//! [59]
+function add() {
+    if (arguments.length != 2)
+        throw Error("add() takes exactly two arguments");
+    return arguments[0] + arguments[1];
+}
+//! [59]
+
+//! [60]
+function add() {
+    if (arguments.length != 2)
+        throw Error("add() takes exactly two arguments");
+    if (typeof arguments[0] != "number")
+        throw TypeError("add(): first argument is not a number");
+    if (typeof arguments[1] != "number")
+        throw TypeError("add(): second argument is not a number");
+    return arguments[0] + arguments[1];
+}
+//! [60]
+
+//! [61]
+function add() {
+    if (arguments.length != 2)
+        throw Error("add() takes exactly two arguments");
+    return Number(arguments[0]) + Number(arguments[1]);
+}
+//! [61]
+
+//! [62]
+QScriptValue add(QScriptContext *ctx, QScriptEngine *eng)
+{
+    if (ctx->argumentCount() != 2)
+        return ctx->throwError("add() takes exactly two arguments");
+    double a = ctx->argument(0).toNumber();
+    double b = ctx->argument(1).toNumber();
+    return a + b;
+}
+//! [62]
+
+//! [63]
+QScriptValue add(QScriptContext *ctx, QScriptEngine *eng)
+{
+    if (ctx->argumentCount() != 2)
+        return ctx->throwError("add() takes exactly two arguments");
+    if (!ctx->argument(0).isNumber())
+        return ctx->throwError(QScriptContext::TypeError, "add(): first argument is not a number");
+    if (!ctx->argument(1).isNumber())
+        return ctx->throwError(QScriptContext::TypeError, "add(): second argument is not a number");
+    double a = ctx->argument(0).toNumber();
+    double b = ctx->argument(1).toNumber();
+    return a + b;
+}
+//! [63]
+
+//! [64]
+function concat() {
+    var result = "";
+    for (var i = 0; i < arguments.length; ++i)
+        result += String(arguments[i]);
+    return result;
+}
+//! [64]
+
+//! [65]
+QScriptValue concat(QScriptContext *ctx, QScriptEngine *eng)
+{
+    QString result = "";
+    for (int i = 0; i < ctx->argumentCount(); ++i)
+        result += ctx->argument(i).toString();
+    return result;
+}
+//! [65]
+
+//! [66]
+function sort(comparefn) {
+    if (comparefn == undefined)
+        comparefn = /* the built-in comparison function */;
+    else if (typeof comparefn != "function")
+        throw TypeError("sort(): argument must be a function");
+    ...
+}
+//! [66]
+
+//! [67]
+QScriptValue sort(QScriptContext *ctx, QScriptEngine *eng)
+{
+    QScriptValue comparefn = ctx->argument(0);
+    if (comparefn.isUndefined())
+        comparefn = /* the built-in comparison function */;
+    else if (!comparefn.isFunction())
+        return ctx->throwError(QScriptContext::TypeError, "sort(): argument is not a function");
+    ...
+}
+//! [67]
+
+//! [68]
+function foo() {
+    // Let bar() take care of this.
+    print("calling bar() with " + arguments.length + "arguments");
+    var result = return bar.apply(this, arguments);
+    print("bar() returned" + result);
+    return result;
+}
+//! [68]
+
+//! [69]
+QScriptValue foo(QScriptContext *ctx, QScriptEngine *eng)
+{
+    QScriptValue bar = eng->globalObject().property("bar");
+    QScriptValue arguments = ctx->argumentsObject();
+    qDebug() << "calling bar() with" << arguments.property("length").toInt32() << "arguments";
+    QScriptValue result = bar.apply(ctx->thisObject(), arguments);
+    qDebug() << "bar() returned" << result.toString();
+    return result;
+}
+//! [69]
+
+//! [70]
+function counter() {
+    var count = 0;
+    return function() {
+        return count++;
+    }
+}
+//! [70]
+
+//! [71]
+var c1 = counter(); // create a new counter function
+var c2 = counter(); // create a new counter function
+print(c1()); // 0
+print(c1()); // 1
+print(c2()); // 0
+print(c2()); // 1
+//! [71]
+
+//! [72]
+QScriptValue counter(QScriptContext *ctx, QScriptEngine *eng)
+{
+    QScriptValue act = ctx->activationObject();
+    act.setProperty("count", 0);
+    QScriptValue result = eng->newFunction(counter_inner);
+    result.setScope(act);
+    return result;
+}
+//! [72]
+
+//! [73]
+QScriptValue counter_inner(QScriptContext *ctx, QScriptEngine *eng)
+{
+    QScriptValue outerAct = ctx->callee().scope();
+    double count = outerAct.property("count").toNumber();
+    outerAct.setProperty("count", count+1);
+    return count;
+}
+//! [73]
+
+//! [74]
+QScriptValue counter_hybrid(QScriptContext *ctx, QScriptEngine *eng)
+{
+    QScriptValue act = ctx->activationObject();
+    act.setProperty("count", 0);
+    return eng->evaluate("(function() { return count++; })");
+}
+//! [74]
+
+//! [75]
+function Book(isbn) {
+    this.isbn = isbn;
+}
+
+var coolBook1 = new Book("978-0131872493");
+var coolBook2 = new Book("978-1593271473");
+//! [75]
+
+//! [76]
+QScriptValue Person_ctor(QScriptContext *ctx, QScriptEngine *eng)
+{
+    QScriptValue object;
+    if (ctx->isCalledAsConstructor()) {
+        object = ctx->thisObject();
+    } else {
+        object = eng->newObject();
+        object.setPrototype(ctx->callee().property("prototype"));
+    }
+    object.setProperty("name", ctx->argument(0));
+    return object;
+}
+//! [76]
+
+//! [77]
+QScriptContext *ctx = eng.pushContext();
+QScriptValue act = ctx->activationObject();
+act.setProperty("digit", 7);
+
+qDebug() << eng.evaluate("digit + 1").toNumber(); // 8
+
+eng.popContext();
+//! [77]
+
+//! [78]
+QScriptValue getSet(QScriptContext *ctx, QScriptEngine *eng)
+{
+    QScriptValue obj = ctx->thisObject();
+    QScriptValue data = obj.data();
+    if (!data.isValid()) {
+        data = eng->newObject();
+        obj.setData(data);
+    }
+    QScriptValue result;
+    if (ctx->argumentCount() == 1) {
+        QString str = ctx->argument(0).toString();
+        str.replace("Roberta", "Ken");
+        result = str;
+        data.setProperty("x", result);
+    } else {
+        result = data.property("x");
+    }
+    return result;
+}
+//! [78]
+
+//! [79]
+QScriptEngine eng;
+QScriptValue obj = eng.newObject();
+obj.setProperty("x", eng.newFunction(getSet),
+                QScriptValue::PropertyGetter|QScriptValue::PropertySetter);
+//! [79]
+
+//! [80]
+obj.x = "Roberta sent me";
+print(obj.x); // "Ken sent me"
+obj.x = "I sent the bill to Roberta";
+print(obj.x); // "I sent the bill to Ken"
+//! [80]
+
+//! [81]
+obj = {};
+obj.__defineGetter__("x", function() { return this._x; });
+obj.__defineSetter__("x", function(v) { print("setting x to", v); this._x = v; });
+obj.x = 123;
+//! [81]
+
+//! [82]
+myButton.text = qsTr("Hello world!");
+//! [82]
+
+//! [83]
+myButton.text = qsTranslate("MyAwesomeScript", "Hello world!");
+//! [83]
+
+//! [84]
+FriendlyConversation.prototype.greeting = function(type)
+{
+    if (FriendlyConversation['greeting_strings'] == undefined) {
+        FriendlyConversation['greeting_strings'] = [
+            QT_TR_NOOP("Hello"),
+            QT_TR_NOOP("Goodbye")
+        ];
+    }
+    return qsTr(FriendlyConversation.greeting_strings[type]);
+}
+//! [84]
+
+//! [85]
+FriendlyConversation.prototype.greeting = function(type)
+{
+    if (FriendlyConversation['greeting_strings'] == undefined) {
+        FriendlyConversation['greeting_strings'] = [
+            QT_TRANSLATE_NOOP("FriendlyConversation", "Hello"),
+            QT_TRANSLATE_NOOP("FriendlyConversation", "Goodbye")
+        ];
+    }
+    return qsTranslate("FriendlyConversation", FriendlyConversation.greeting_strings[type]);
+}
+//! [85]
+
+//! [86]
+FileCopier.prototype.showProgress = function(done, total, currentFileName)
+{
+    this.label.text = qsTr("%1 of %2 files copied.\nCopying: %3")
+                      .arg(done)
+                      .arg(total)
+                      .arg(currentFileName));
+}
+//! [86]
+
+//! [87]
+lupdate myscript.qs -ts myscript_la.ts
+//! [87]
+
+//! [88]
+lupdate -extensions qs scripts/ -ts scripts_la.ts
+//! [88]
+
+//! [89]
+lrelease myscript_la.ts
+//! [89]
+
+//! [90]
+({ unitName: "Celsius",
+   toKelvin: function(x) { return x + 273; }
+ })
+//! [90]
+
+//! [91]
+QScriptValue object = engine.evaluate("({ unitName: 'Celsius', toKelvin: function(x) { return x + 273; } })");
+QScriptValue toKelvin = object.property("toKelvin");
+QScriptValue result = toKelvin.call(object, QScriptValueList() << 100);
+qDebug() << result.toNumber(); // 373
+//! [91]
+
+//! [92]
+QScriptValue add = engine.globalObject().property("add");
+qDebug() << add.call(QScriptValue(), QScriptValueList() << 1 << 2).toNumber(); // 3
+//! [92]
+
+//! [93]
+typedef QSharedPointer<QXmlStreamReader> XmlStreamReaderPointer;
+
+Q_DECLARE_METATYPE(XmlStreamReaderPointer)
+
+QScriptValue constructXmlStreamReader(QScriptContext *context, QScriptEngine *engine)
+{
+    if (!context->isCalledAsConstructor())
+        return context->throwError(QScriptContext::SyntaxError, "please use the 'new' operator");
+
+    QIODevice *device = qobject_cast<QIODevice*>(context->argument(0).toQObject());
+    if (!device)
+        return context->throwError(QScriptContext::TypeError, "please supply a QIODevice as first argument");
+
+    // Create the C++ object
+    QXmlStreamReader *reader = new QXmlStreamReader(device);
+
+    XmlStreamReaderPointer pointer(reader);
+
+    // store the shared pointer in the script object that we are constructing
+    return engine->newVariant(context->thisObject(), qVariantFromValue(pointer));
+}
+//! [93]
+
+//! [94]
+QScriptValue xmlStreamReader_atEnd(QScriptContext *context, QScriptEngine *)
+{
+    XmlStreamReaderPointer reader = qscriptvalue_cast<XmlStreamReaderPointer>(context->thisObject());
+    if (!reader)
+        return context->throwError(QScriptContext::TypeError, "this object is not an XmlStreamReader");
+    return reader->atEnd();
+}
+//! [94]
+
+//! [95]
+    QScriptEngine engine;
+    QScriptValue xmlStreamReaderProto = engine.newObject();
+    xmlStreamReaderProto.setProperty("atEnd", engine.newFunction(xmlStreamReader_atEnd));
+
+    QScriptValue xmlStreamReaderCtor = engine.newFunction(constructXmlStreamReader, xmlStreamReaderProto);
+    engine.globalObject().setProperty("XmlStreamReader", xmlStreamReaderCtor);
+//! [95]