Thanks Stephen!
I found a solution, which is very similar to your approach.

QJSValue myExt = m_engine->newQObject(new ScriptModuleMath());
// mount the whole class ScriptModule to the engine --> Math.sqrt(4)
m_engine->globalObject().setProperty("Math", myExt);
// mount only the sqrt function to the engine --> sqrt(4)
m_engine->globalObject().setProperty("sqrt", myExt.property("sqrt"));

the first mount allows me now to access the whole object and of course my 
sqrt() method.
i.e. Math.sqrt(4);

the second mount allows me to directly access the sqrt() method without the 
instance.
i.e. sqrt(4);

Thanks for your suggestion.

Best Regards,
Stefan

-----Original Message-----
From: Interest [mailto:interest-bounces+stefan.walter=lisec....@qt-project.org] 
On Behalf Of Stephen Bryant
Sent: Dienstag, 23. Februar 2016 15:12
To: interest@qt-project.org
Subject: Re: [Interest] QJSEngine replacement for QScriptEngine misses 
newFunction

Hi Stefan,

On Tuesday 23 February 2016 05:34:03 Walter Stefan wrote:
[...]
> 
> And in this way. I can use it then in the script:
> value = sqrt(4);
> 
> I actually don't want to map a whole QObject, because that would 
> require a call like this: value = MyMath.sqrt(4);
> 
> Is there any way to achive in QJSEngine the same result as I do within 
> the QScriptEngine?


Is far as I know, the only way is to do the thing you don't want to: map the 
whole QObject.  You can, however, add a JS function reference inside the engine 
so you can call the function without the object name.

QJSEngine engine;
engine.globalObject().setProperty(
  "MyMath",
  engine.newQObject( new ScriptModuleMath( &engine ) ) ); engine.evaluate( "var 
sqrt=MyMath.sqrt;" );  // repeat for other functions

This will now work in JS:  value = sqrt(4);

You'll presumably be aware that all public slots of MyMath will automatically 
be available as JS functions.  That makes things a little easier.

It seems that you also need a QObject instance, event if you only want to 
expose static methods.

BTW: your C++ native function can use this signature: double sqrt(double); 
You'll get NaN if somebody calls it with a non-number.  The return value is 
also automatically converted as there is a QJSValue constructor that takes a 
double.


There's no direct equivalent of read-only/undeletable, unfortunately.  I'm 
missing that too.  The closest you can get is that your MyMath functions can't 
be altered from JS, and you can also make a read-only Q_PROPERTY.

However, there is nothing stopping somebody from reassigning properties of the 
global object - so your 'sqrt' function and 'MyMath' object could be replaced.  
This may be a security concern, depending on what you're doing.


Best regards,

Steve
_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to