12
function myInterestingScriptFunction() { ... }
14
myQObject.somethingChanged.connect(myInterestingScriptFunction);
19
myQObject.somethingChanged.connect(myOtherQObject.doSomething);
24
myQObject.somethingChanged.disconnect(myInterestingFunction);
25
myQObject.somethingChanged.disconnect(myOtherQObject.doSomething);
31
var fun = function() { print(this.x); };
32
myQObject.somethingChanged.connect(obj, fun);
37
myQObject.somethingChanged.disconnect(obj, fun);
42
var obj = { x: 123, fun: function() { print(this.x); } };
43
myQObject.somethingChanged.connect(obj, "fun");
48
myQObject.somethingChanged.disconnect(obj, "fun");
54
myQObject.somethingChanged.connect(myQObject, "slotThatDoesntExist");
62
myQObject.somethingChanged("hello");
67
myQObject.myOverloadedSlot(10); // will call the int overload
68
myQObject.myOverloadedSlot("10"); // will call the QString overload
73
myQObject['myOverloadedSlot(int)']("10"); // call int overload; the argument is converted to an int
74
myQObject['myOverloadedSlot(QString)'](10); // call QString overload; the argument is converted to a string
79
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled)
84
myQObject.enabled = true;
88
myQObject.enabled = !myQObject.enabled;
98
myDialog.okButton.objectName = "cancelButton";
99
// from now on, myDialog.cancelButton references the button
104
var okButton = myDialog.findChild("okButton");
105
if (okButton != null) {
106
// do something with the OK button
109
var buttons = myDialog.findChildren(RegExp("button[0-9]+"));
110
for (var i = 0; i < buttons.length; ++i) {
111
// do something with buttons[i]
117
QScriptValue myQObjectConstructor(QScriptContext *context, QScriptEngine *engine)
119
// let the engine manage the new object's lifetime.
120
return engine->newQObject(new MyQObject(), QScriptEngine::ScriptOwnership);
126
class MyObject : public QObject
133
void aNonScriptableFunction();
135
public slots: // these functions (slots) will be available in QtScript
136
void calculate( ... );
137
void setEnabled( bool enabled );
138
bool isEnabled() const;
148
class MyObject : public QObject
153
Q_INVOKABLE void thisMethodIsInvokableInQtScript();
154
void thisMethodIsNotInvokableInQtScript();
162
var obj = new MyObject;
163
obj.setEnabled( true );
164
print( "obj is enabled: " + obj.isEnabled() );
169
var obj = new MyObject;
171
print( "obj is enabled: " + obj.enabled );
176
class MyObject : public QObject
179
// define the enabled property
180
Q_PROPERTY( bool enabled WRITE setEnabled READ isEnabled )
185
void aNonScriptableFunction();
187
public slots: // these functions (slots) will be available in QtScript
188
void calculate( ... );
189
void setEnabled( bool enabled );
190
bool isEnabled() const;
200
Q_PROPERTY(int nonScriptableProperty READ foo WRITE bar SCRIPTABLE false)
205
class MyObject : public QObject
208
// define the enabled property
209
Q_PROPERTY( bool enabled WRITE setEnabled READ isEnabled )
214
void aNonScriptableFunction();
216
public slots: // these functions (slots) will be available in QtScript
217
void calculate( ... );
218
void setEnabled( bool enabled );
219
bool isEnabled() const;
221
signals: // the signals
222
void enabledChanged( bool newState );
232
function enabledChangedHandler( b )
234
print( "state changed to: " + b );
239
var obj = new MyObject();
240
// connect a script function to the signal
241
obj["enabledChanged(bool)"].connect(enabledChangedHandler);
243
print( "obj is enabled: " + obj.enabled );
249
var o = new Object();
251
print(o.hasOwnProperty('foo')); // true
252
print(o.hasOwnProperty('bar')); // false
253
print(o); // calls o.toString(), which returns "[object Object]"
258
function Person(name)
266
Person.prototype.toString = function() { return "Person(name: " + this.name + ")"; }
271
var p1 = new Person("John Doe");
272
var p2 = new Person("G.I. Jane");
273
print(p1); // "Person(name: John Doe)"
274
print(p2); // "Person(name: G.I. Jane)"
279
print(p1.hasOwnProperty('name')); // 'name' is an instance variable, so this returns true
280
print(p1.hasOwnProperty('toString')); // returns false; inherited from prototype
281
print(p1 instanceof Person); // true
282
print(p1 instanceof Object); // true
287
function Employee(name, salary)
289
Person.call(this, name); // call base constructor
291
this.salary = salary;
294
// set the prototype to be an instance of the base class
295
Employee.prototype = new Person();
297
// initialize prototype
298
Employee.prototype.toString = function() { ... }
303
var e = new Employee("Johnny Bravo", 5000000);
304
print(e instanceof Employee); // true
305
print(e instanceof Person); // true
306
print(e instanceof Object); // true
307
print(e instanceof Array); // false
312
QScriptValue Person_ctor(QScriptContext *context, QScriptEngine *engine)
314
QString name = context->argument(0).toString();
315
context->thisObject().setProperty("name", name);
316
return engine->undefinedValue();
322
QScriptValue Person_prototype_toString(QScriptContext *context, QScriptEngine *engine)
324
QString name = context->thisObject().property("name").toString();
325
QString result = QString::fromLatin1("Person(name: %0)").arg(name);
332
QScriptEngine engine;
333
QScriptValue ctor = engine.newFunction(Person_ctor);
334
ctor.property("prototype").setProperty("toString", engine.newFunction(Person_prototype_toString));
335
QScriptValue global = engine.globalObject();
336
global.setProperty("Person", ctor);
341
QScriptValue Employee_ctor(QScriptContext *context, QScriptEngine *engine)
343
QScriptValue super = context->callee().property("prototype").property("constructor");
344
super.call(context->thisObject(), QScriptValueList() << context->argument(0));
345
context->thisObject().setProperty("salary", context->argument(1));
346
return engine->undefinedValue();
352
QScriptValue empCtor = engine.newFunction(Employee_ctor);
353
empCtor.setProperty("prototype", global.property("Person").construct());
354
global.setProperty("Employee", empCtor);
359
Q_DECLARE_METATYPE(QPointF)
360
Q_DECLARE_METATYPE(QPointF*)
362
QScriptValue QPointF_prototype_x(QScriptContext *context, QScriptEngine *engine)
364
// Since the point is not to be modified, it's OK to cast to a value here
365
QPointF point = qscriptvalue_cast<QPointF>(context->thisObject());
369
QScriptValue QPointF_prototype_setX(QScriptContext *context, QScriptEngine *engine)
371
// Cast to a pointer to be able to modify the underlying C++ value
372
QPointF *point = qscriptvalue_cast<QPointF*>(context->thisObject());
374
return context->throwError(QScriptContext::TypeError, "QPointF.prototype.setX: this object is not a QPointF");
375
point->setX(context->argument(0).toNumber());
376
return engine->undefinedValue();
382
var o = new Object();
383
(o.__proto__ === Object.prototype); // this evaluates to true
388
var o = new Object();
389
o.__defineGetter__("x", function() { return 123; });
395
var o = new Object();
396
o.__defineSetter__("x", function(v) { print("and the value is:", v); });
397
o.x = 123; // will print "and the value is: 123"
402
class MyObject : public QObject
408
Q_DECLARE_METATYPE(MyObject*)
410
QScriptValue myObjectToScriptValue(QScriptEngine *engine, MyObject* const &in)
411
{ return engine->newQObject(in); }
413
void myObjectFromScriptValue(const QScriptValue &object, MyObject* &out)
414
{ out = qobject_cast<MyObject*>(object.toQObject()); }
418
qScriptRegisterMetaType(&engine, myObjectToScriptValue, myObjectFromScriptValue);
422
QScriptValue QPoint_ctor(QScriptContext *context, QScriptEngine *engine)
424
int x = context->argument(0).toInt32();
425
int y = context->argument(1).toInt32();
426
return engine->toScriptValue(QPoint(x, y));
431
engine.globalObject().setProperty("QPoint", engine.newFunction(QPoint_ctor));
435
QScriptValue myPrintFunction(QScriptContext *context, QScriptEngine *engine)
438
for (int i = 0; i < context->argumentCount(); ++i) {
441
result.append(context->argument(i).toString());
444
QScriptValue calleeData = context->callee().data();
445
QPlainTextEdit *edit = qobject_cast<QPlainTextEdit*>(calleeData.toQObject());
446
edit->appendPlainText(result);
448
return engine->undefinedValue();
453
int main(int argc, char **argv)
455
QApplication app(argc, argv);
460
QScriptValue fun = eng.newFunction(myPrintFunction);
461
fun.setData(eng.newQObject(&edit));
462
eng.globalObject().setProperty("print", fun);
464
eng.evaluate("print('hello', 'world')");
474
QLineEdit *edit = new QLineEdit(...);
475
QScriptValue handler = eng.evaluate("function(text) { print('text was changed to', text); }");
476
qScriptConnect(edit, SIGNAL(textChanged(const QString &)), QScriptValue(), handler);
480
QLineEdit *edit1 = new QLineEdit(...);
481
QLineEdit *edit2 = new QLineEdit(...);
483
QScriptValue handler = eng.evaluate("function() { print('I am', this.name); }");
484
QScriptValue obj1 = eng.newObject();
485
obj1.setProperty("name", "the walrus");
486
QScriptValue obj2 = eng.newObject();
487
obj2.setProperty("name", "Sam");
489
qScriptConnect(edit1, SIGNAL(returnPressed()), obj1, handler);
490
qScriptConnect(edit2, SIGNAL(returnPressed()), obj2, handler);
494
var getProperty = function(name) { return this[name]; };
496
name = "Global Object"; // creates a global variable
497
print(getProperty("name")); // "Global Object"
499
var myObject = { name: 'My Object' };
500
print(getProperty.call(myObject, "name")); // "My Object"
502
myObject.getProperty = getProperty;
503
print(myObject.getProperty("name")); // "My Object"
505
getProperty.name = "The getProperty() function";
506
getProperty.getProperty = getProperty;
507
getProperty.getProperty("name"); // "The getProperty() function"
511
var o = { a: 1, b: 2, sum: function() { return a + b; } };
512
print(o.sum()); // reference error, or sum of global variables a and b!!
516
var o = { a: 1, b: 2, sum: function() { return this.a + this.b; } };
521
QScriptValue getProperty(QScriptContext *ctx, QScriptEngine *eng)
523
QString name = ctx->argument(0).toString();
524
return ctx->thisObject().property(name);
529
QScriptValue myCompare(QScriptContext *ctx, QScriptEngine *eng)
531
double first = ctx->argument(0).toNumber();
532
double second = ctx->argument(1).toNumber();
536
else if (first < second)
546
QScriptValue comparefn = eng.newFunction(myCompare);
547
QScriptValue array = eng.evaluate("new Array(10, 5, 20, 15, 30)");
548
array.property("sort").call(array, QScriptValueList() << comparefn);
550
// prints "5,10,15,20,30"
551
qDebug() << array.toString();
555
QScriptValue rectifier(QScriptContext *ctx, QScriptEngine *eng)
557
QRectF magicRect = qscriptvalue_cast<QRectF>(ctx->callee().data());
558
QRectF sourceRect = qscriptvalue_cast<QRectF>(ctx->argument(0));
559
return eng->toScriptValue(sourceRect.intersected(magicRect));
564
QScriptValue fun = eng.newFunction(rectifier);
565
QRectF magicRect = QRectF(10, 20, 30, 40);
566
fun.setData(eng.toScriptValue(magicRect));
567
eng.globalObject().setProperty("rectifier", fun);
578
return arguments[0] + arguments[1];
583
QScriptValue add(QScriptContext *ctx, QScriptEngine *eng)
585
double a = ctx->argument(0).toNumber();
586
double b = ctx->argument(1).toNumber();
593
if (arguments.length != 2)
594
throw Error("add() takes exactly two arguments");
595
return arguments[0] + arguments[1];
601
if (arguments.length != 2)
602
throw Error("add() takes exactly two arguments");
603
if (typeof arguments[0] != "number")
604
throw TypeError("add(): first argument is not a number");
605
if (typeof arguments[1] != "number")
606
throw TypeError("add(): second argument is not a number");
607
return arguments[0] + arguments[1];
613
if (arguments.length != 2)
614
throw Error("add() takes exactly two arguments");
615
return Number(arguments[0]) + Number(arguments[1]);
620
QScriptValue add(QScriptContext *ctx, QScriptEngine *eng)
622
if (ctx->argumentCount() != 2)
623
return ctx->throwError("add() takes exactly two arguments");
624
double a = ctx->argument(0).toNumber();
625
double b = ctx->argument(1).toNumber();
631
QScriptValue add(QScriptContext *ctx, QScriptEngine *eng)
633
if (ctx->argumentCount() != 2)
634
return ctx->throwError("add() takes exactly two arguments");
635
if (!ctx->argument(0).isNumber())
636
return ctx->throwError(QScriptContext::TypeError, "add(): first argument is not a number");
637
if (!ctx->argument(1).isNumber())
638
return ctx->throwError(QScriptContext::TypeError, "add(): second argument is not a number");
639
double a = ctx->argument(0).toNumber();
640
double b = ctx->argument(1).toNumber();
648
for (var i = 0; i < arguments.length; ++i)
649
result += String(arguments[i]);
655
QScriptValue concat(QScriptContext *ctx, QScriptEngine *eng)
658
for (int i = 0; i < ctx->argumentCount(); ++i)
659
result += ctx->argument(i).toString();
665
function sort(comparefn) {
666
if (comparefn == undefined)
667
comparefn = /* the built-in comparison function */;
668
else if (typeof comparefn != "function")
669
throw TypeError("sort(): argument must be a function");
675
QScriptValue sort(QScriptContext *ctx, QScriptEngine *eng)
677
QScriptValue comparefn = ctx->argument(0);
678
if (comparefn.isUndefined())
679
comparefn = /* the built-in comparison function */;
680
else if (!comparefn.isFunction())
681
return ctx->throwError(QScriptContext::TypeError, "sort(): argument is not a function");
688
// Let bar() take care of this.
689
print("calling bar() with " + arguments.length + "arguments");
690
var result = return bar.apply(this, arguments);
691
print("bar() returned" + result);
697
QScriptValue foo(QScriptContext *ctx, QScriptEngine *eng)
699
QScriptValue bar = eng->globalObject().property("bar");
700
QScriptValue arguments = ctx->argumentsObject();
701
qDebug() << "calling bar() with" << arguments.property("length").toInt32() << "arguments";
702
QScriptValue result = bar.apply(ctx->thisObject(), arguments);
703
qDebug() << "bar() returned" << result.toString();
718
var c1 = counter(); // create a new counter function
719
var c2 = counter(); // create a new counter function
727
QScriptValue counter(QScriptContext *ctx, QScriptEngine *eng)
729
QScriptValue act = ctx->activationObject();
730
act.setProperty("count", 0);
731
QScriptValue result = eng->newFunction(counter_inner);
732
result.setScope(act);
738
QScriptValue counter_inner(QScriptContext *ctx, QScriptEngine *eng)
740
QScriptValue outerAct = ctx->callee().scope();
741
double count = outerAct.property("count").toNumber();
742
outerAct.setProperty("count", count+1);
748
QScriptValue counter_hybrid(QScriptContext *ctx, QScriptEngine *eng)
750
QScriptValue act = ctx->activationObject();
751
act.setProperty("count", 0);
752
return eng->evaluate("function() { return count++; }");
757
function Book(isbn) {
761
var coolBook1 = new Book("978-0131872493");
762
var coolBook2 = new Book("978-1593271473");
766
QScriptValue Person_ctor(QScriptContext *ctx, QScriptEngine *eng)
769
if (ctx->isCalledAsConstructor()) {
770
object = ctx->thisObject();
772
object = eng->newObject();
773
object.setPrototype(ctx->callee().property("prototype"));
775
object.setProperty("name", ctx->argument(0));
781
QScriptContext *ctx = eng.pushContext();
782
QScriptValue act = ctx->activationObject();
783
act.setProperty("digit", 7);
785
qDebug() << eng.evaluate("digit + 1").toNumber(); // 8
791
QScriptValue getSet(QScriptContext *ctx, QScriptEngine *eng)
793
QScriptValue obj = ctx->thisObject();
794
QScriptValue data = obj.data();
795
if (!data.isValid()) {
796
data = eng->newObject();
800
if (ctx->argumentCount() == 1) {
801
QString str = ctx->argument(0).toString();
802
str.replace("Roberta", "Ken");
804
data.setProperty("x", result);
806
result = data.property("x");
814
QScriptValue obj = eng.newObject();
815
obj.setProperty("x", eng.newFunction(getSet),
816
QScriptValue::PropertyGetter|QScriptValue::PropertySetter);
820
obj.x = "Roberta sent me";
821
print(obj.x); // "Ken sent me"
822
obj.x = "I sent the bill to Roberta";
823
print(obj.x); // "I sent the bill to Ken"
828
obj.__defineGetter__("x", function() { return this._x; });
829
obj.__defineSetter__("x", function(v) { print("setting x to", v); this._x = v; });
834
myButton.text = qsTr("Hello world!");
838
myButton.text = qsTranslate("MyAwesomeScript", "Hello world!");
842
FriendlyConversation.prototype.greeting = function(type)
844
if (FriendlyConversation['greeting_strings'] == undefined) {
845
FriendlyConversation['greeting_strings'] = [
847
QT_TR_NOOP("Goodbye")
850
return qsTr(FriendlyConversation.greeting_strings[type]);
855
FriendlyConversation.prototype.greeting = function(type)
857
if (FriendlyConversation['greeting_strings'] == undefined) {
858
FriendlyConversation['greeting_strings'] = [
859
QT_TRANSLATE_NOOP("FriendlyConversation", "Hello"),
860
QT_TRANSLATE_NOOP("FriendlyConversation", "Goodbye")
863
return qsTranslate("FriendlyConversation", FriendlyConversation.greeting_strings[type]);
868
FileCopier.prototype.showProgress = function(done, total, currentFileName)
870
this.label.text = qsTr("%1 of %2 files copied.\nCopying: %3")
873
.arg(currentFileName));
878
lupdate myscript.qs -ts myscript_la.ts
882
lupdate -extensions qs scripts/ -ts scripts_la.ts
886
lrelease myscript_la.ts
890
({ unitName: "Celsius",
891
toKelvin: function(x) { return x + 273; }
896
QScriptValue object = engine.evaluate("({ unitName: 'Celsius', toKelvin: function(x) { return x + 273; } })");
897
QScriptValue toKelvin = object.property("toKelvin");
898
QScriptValue result = toKelvin.call(object, QScriptValueList() << 100);
899
qDebug() << result.toNumber(); // 373
903
QScriptValue add = engine.globalObject().property("add");
904
qDebug() << add.call(QScriptValue(), QScriptValueList() << 1 << 2).toNumber(); // 3
908
typedef QSharedPointer<QXmlStreamReader> XmlStreamReaderPointer;
910
Q_DECLARE_METATYPE(XmlStreamReaderPointer)
912
QScriptValue constructXmlStreamReader(QScriptContext *context, QScriptEngine *engine)
914
if (!context->isCalledAsConstructor())
915
return context->throwError(QScriptContext::SyntaxError, "please use the 'new' operator");
917
QIODevice *device = qobject_cast<QIODevice*>(context->argument(0).toQObject());
919
return context->throwError(QScriptContext::TypeError, "please supply a QIODevice as first argument");
921
// Create the C++ object
922
QXmlStreamReader *reader = new QXmlStreamReader(device);
924
XmlStreamReaderPointer pointer(reader);
926
// store the shared pointer in the script object that we are constructing
927
return engine->newVariant(context->thisObject(), qVariantFromValue(pointer));
932
QScriptValue xmlStreamReader_atEnd(QScriptContext *context, QScriptEngine *)
934
XmlStreamReaderPointer reader = qscriptvalue_cast<XmlStreamReaderPointer>(context->thisObject());
936
return context->throwError(QScriptContext::TypeError, "this object is not an XmlStreamReader");
937
return reader->atEnd();
942
QScriptEngine engine;
943
QScriptValue xmlStreamReaderProto = engine.newObject();
944
xmlStreamReaderProto.setProperty("atEnd", engine.newFunction(xmlStreamReader_atEnd));
946
QScriptValue xmlStreamReaderCtor = engine.newFunction(constructXmlStreamReader, xmlStreamReaderProto);
947
engine.globalObject().setProperty("XmlStreamReader", xmlStreamReaderCtor);