I've successfully added an C++ object to a QWebFrame with addToJavaScriptWindowObject, and can call a slot on that object from javascript.
But what I really want to do is have one of those slots return a new object. For example, I have a slot like this, which returns a QObject derived class instance:
MyObject* MyApp::helloWorld()
{
//MyObject is dervied from QObject
return new MyObject();
}
I can call this slot from javascript successfully like this
var foo=myapp.helloWorld();
But foo appears to be empty, I can't call any slots or access any properties on it from Javascript.
Any ideas on how I can achieve this?
One rather ugly hack I've considered is to use addToJavaScriptWindowObject to drop the object I want to return into the window object with a random name, then have my slot return the name of the object instance instead:
QString MyApp::helloWorld()
{
//general a unique name for the js variable
QString name=getRandomVariableName();
//here's the object we want to expose to js
MyObject* pReturn=new MyObject();
//we make attach our object to the js window object
getWebFrame()->addToJavaScriptWindowObject(name, pReturn,
QScriptEngine::ScriptOwnership);
//tell js the name we used
return name;
}
The JS can be written to check if the return value is a string, and if it is, grab the object from the window.:
var foo=myapp.helloWorld();
if (typeof foo == "string")
{
foo=window[foo];
}
A little ugly, but will get me by until a better method comes along. Future Qt versions are going unify the scripting support so that it's all based on the JavaScriptCore in WebKit, so hopefully this will improve then!
You can assign your Object pointer to a QObject * and return that.
QObject * obj = new MyObject();
return obj;
That is working for me on Qt Webkit port on Linux.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With