This document provides an overview of using QtScript to add scripting capabilities to Qt applications. It discusses embedding the QtScript engine, exposing C++ objects and APIs to scripts, debugging scripts, and integrating QtScript with Qt's meta-object system. The presentation includes examples of calculating values from scripts, configuring the script environment, calling into scripts from C++, and debugging scripts. The goal is to give attendees an understanding of how to make their Qt applications scriptable using QtScript.
10. The QtScript Engine
• Executes scripts
• Performs C++ <--> script bridging
• It's re-entrant
10
11. The QtScript API
• Embed QtScript engine in your application
• Expose C++ objects to script environment
• Work with script values from C++
11
12. Why should you use QtScript?
• Easy to embed into any Qt application
• Tight integration with rest of Qt
• Easy-to-use API
12
13. Agenda
• What is application scripting?
• QtScript tour (the essentials)
• Debugger
• Misc.
13
14. QtScript tour (the essentials)
• Basic embedding (example)
• Working with QScriptValues
• Configuring the script environment
• Qt meta-object system integration
14
15. Example: Meaning of Life Calculator
“Our objective: Write an application that uses
QtScript to calculate the meaning of life”
15
19. QtScript tour (the essentials)
• Basic embedding (example)
• Working with QScriptValues
• Configuring the script environment
• Qt meta-object system integration
19
20. QScriptValue class
• Represents a QtScript (JavaScript) value
• Undefined
• Null
• Boolean
• Number
• String
• Object
–Functions, arrays, regexps, errors, ...
• Invalid (no value)
20
21. QScriptValue type checks & conversion
• isXXX(): Tests if value is of a certain type
• toXXX(): Converts to Qt/C++ type
• qscriptvalue_cast(): Converts to C++ type
21
22. QScriptValue construction
• Constructors for standard Qt/C++ types
• qScriptValueFromValue()
• Counterpart to qscriptvalue_cast()
• QScriptEngine::newXXX()
• Object, QObject, Array, RegExp
22
25. QScriptValue holds reference to object (II)
QScriptValue same = object;
object.setProperty(“foo”, 456);
qDebug() << same.toString();
25
26. QScriptValue called as function
JS: myArray.sort(); or
myArray['sort'].call(myArray);
C++: myArray.property(“sort”)
.call(myArray);
26
27. Calling a function with arguments (I)
JS: myObject.myFunction(123, “foo”);
C++: myFunction.call(
myObject,
QScriptValueList()
<< 123 << “foo”);
27
28. Calling a function with arguments (II)
QScriptValue adder = engine.evaluate(
“(function(a, b) { return a+b; })”);
QScriptValue result = adder.call(
/*thisObject=*/QScriptValue(),
QScriptValueList() << 41 << 1);
28
29. Calling a function as constructor (I)
JS: function Point(x, y) {
this.x = x;
this.y = y;
}
...
new Point(10, 20);
29
30. Calling a function as constructor (II)
C++:
QScriptValue p = Point.construct(
QScriptValueList() << 10 << 20);
qDebug() << p.property(“x”).toNumber();
30
32. Working with JavaScript Arrays (I)
JS:
var a = [10, 20, 30];
print(a[0], a['0']); // same property
a.foo = 123;
a.push(40);
a[a.length] = 'appended';
32
33. Working with JavaScript Arrays (II)
C++:
QScriptValue a = engine.evaluate(
“[10, 20, 30]”); // array literal
qDebug() << a.property(“length”).toInt32();
qDebug() << a.property(“0”).toNumber();
// for convenience + speed
qDebug() << a.property(0).toNumber();
33
34. Error Handling (I)
// Uh-oh, this script will throw an error!
QScriptValue result = engine.evaluate(
“noSuchVariable”);
34
35. Error Handling (II)
if (result.isError()) {
QString message = result.toString();
// Notify user about the problem ...
}
35
36. QScriptValue API Summary
• isXXX(), toXXX()
• property() and setProperty()
• call(), construct()
• QScriptValueIterator for introspection
36
37. QtScript tour (the essentials)
• Basic embedding (example)
• Working with QScriptValues
• Configuring the script environment
• Qt meta-object system integration
37
38. The Global Object
• A built-in script object
• Every QScriptEngine has one
• QScriptEngine::globalObject()
• Initially contains properties defined by ECMA-262
38
39. Tailoring Scripting to Your Application
• Design “contract” of C++ <--> script interaction
• Set properties of Global Object
• Evaluate scripts that use your API
• (Optional: Call back into script objects as
appropriate)
39
40. Example: Meaning of Life Environment
C++:
QScriptEngine engine;
QScriptValue global = engine.globalObject();
global.setProperty(“meaningOfLife”, 42,
QScriptValue::ReadOnly);
JS:
var myMeaningOfLife = Math.sqrt(meaningOfLife);
40
42. QtScript tour (the essentials)
• Basic embedding (example)
• Working with QScriptValues
• Configuring the script environment
• Qt meta-object system integration
42
43. Qt Meta-Object System
• In Qt, QObject-based classes can be introspected
at runtime
• Properties
• Signals & slots
• QObject::connect()
• Qt Designer property editor
• ...
43
51. Agenda
• What is application scripting?
• QtScript tour (the essentials)
• Debugger
• Misc.
51
52. The QtScript Debugger
• Graphical debugger
• Introduced in Qt 4.5
• To make the API available in your application:
QT += scripttools
#include <QtScriptTools>
52
54. The QtScript Debugger API (I)
One class in public API: QScriptEngineDebugger
QScriptEngine engine;
QScriptEngineDebugger debugger;
debugger.attachTo(&engine);
// evaluate scripts ...
54
55. The QtScript Debugger API (II)
• Debugger actions can be programmatically
triggered
• Individual debugger widgets are accessible
55
56. Invoking the Debugger from a Script
• Use the debugger keyword
• Becomes no-op if no debugger is attached
JS:
var a = Math.random();
debugger; // synchronously run debugger
var b = Math.random();
debugger;
return a + b;
56
57. Agenda
• What is application scripting?
• QtScript tour (the essentials)
• Debugger
• Misc.
57
60. Prototype-based Inheritance: Why care?
• Not every QObject member is a property / signal /
slot
• Not everything is a QObject
• Not everything should/needs to be a QObject
• JS developers are familiar with prototypes
60
61. Prototype-based Inheritance: How?
• Create a prototype object for the C++ type
• Register the type with Qt's meta-type system
• Associate prototype object with meta-type ID
• Create QScriptValues from the C++ type
(qScriptValueFromValue())
61
62. Bindings for Qt's APIs (I)
• Available as stand-alone project
• qtscriptgenerator on Qt Labs
(http://labs.qt.nokia.com)
62
63. Bindings for Qt's APIs (II)
• Creates plugins that can be imported into a script
engine
• Provides bindings for most of Qt's classes
• Makes it possible to write pure script applications
63
64. Summary
• It's easy to make your Qt application scriptable
with QtScript
• There's a QtScript debugger (also part of Qt)
• You can achieve a lot by mastering a small API
64