[Development] QtScript vs Qml/QJsEngine ?

Kent Hansen kent.hansen at nokia.com
Thu May 31 08:41:29 CEST 2012


Hi,

Den 30. mai 2012 15:23, skrev ext Diego Iastrubni:
> On Wed, May 30, 2012 at 4:11 PM, Olivier Goffart <olivier at woboq.com 
> <mailto:olivier at woboq.com>> wrote:
>
>     On Saturday 26 May 2012 12:51:23 Stephen Kelly wrote:
>     > Hi,
>     >
>     > There is a discussion on a kde list touching on whether there is a
>     > replacement for QtScript in Qt 5.
>     >
>     >
>     http://thread.gmane.org/gmane.comp.kde.devel.kwrite/32993/focus=75079
>     >
>     > Is the QJSEngine the start of public API providing a replacement for
>     > QtScript?
>
>
> So as an application developer, which wants to add JS scripting 
> capabilities to JavaScript code (so user can extend my application). 
> What are my options?
>
> How can I load JS files, and call some specific functions defined 
> internally in those JS? I will also need to expose some API of mine to 
> those JS files.
>
> (Note: I am not talking about QML at all)
>

The QJSEngine/Value API already supports that use case. The code would 
be 99% the same as with QtScript, if you're familiar with that.

QJSEngine engine;
engine.evaluate("function add(a, b) { return a+ b; }"); // contents of 
some file
QJSValue addFun = engine.globalObject().property("add"); // get the 
function from the script
qDebug() << addFun.call(QJSValueList() << 1 << 2).toNumber();

Exposing a QObject is also similar to QtScript:

MyQObject *obj = ...;
engine.globalObject().setProperty("myQObject", engine.newQObject(obj));
engine.evaluate("myQObject.someSlot()");

What's missing is the more low-level API, like QScriptContext that 
Olivier mentioned. There's currently no API for exposing a "plain C 
callback" with QJS; everything has to go through the QObject binding. 
You can provide individual functions to JS by only exposing a particular 
QObject wrapper function, e.g.:

engine.globalObject().setProperty("myGlobalFunction", 
engine.newQObject(obj).property("someSlot"));

There's currently no API for dealing with exceptions. QtScript had 
uncaughtExceptionBacktrace() and friends; in QJS there is only 
QJSValue::isError() as of yet. You can get error messages, stack trace 
etc. by querying properties of error objects.

QJS has no debugging API or tools. V8 provides a public debugging API, 
but we'd have to be very careful if QJS were to wrap that (again, to 
avoid leaking back-end details).

Also worth mentioning is the quirky 
QScriptEngine::setProcessEventsInterval(), which was annoying to support 
with both JSC and V8 (and didn't ever work reliably even with the 
original back-end, because the engine could potentially call into a 
long-running C++ function, which invalidated the promise of respecting 
the user-specified interval). If you need to execute potentially 
long-running JavaScript, you'll need to do it from a separate thread 
with QJS.

Best regards,
Kent



More information about the Development mailing list