tags:

views:

69

answers:

2

Hi guys, It’s all the day that I’m trying to make this code working. It should be the same code presented in the QScript help page but unfortunately it doesn’t work at all!

class Person
{
public:
 QString nm;

 Person()
 {

 }

 Person(QString& name)
  :nm(name)
 {

 }
};

Q_DECLARE_METATYPE(Person)
Q_DECLARE_METATYPE(Person*)

QScriptValue Person_ctor(QScriptContext* c,QScriptEngine* e)
{
 QString x = c->argument(0).toString();
 return e->toScriptValue(Person(x));
}

QScriptValue Person_prototype_toString(QScriptContext* c,QScriptEngine* e)
{
 Person* per = qscriptvalue_cast(c->thisObject());
 qDebug(qPrintable(per->nm));
 return e->undefinedValue();
}


....
 QScriptValue per_ctr = eng->newFunction(Person_ctor);
 per_ctr.property("prototype").setProperty("toString",eng->newFunction(Person_prototype_toString));
 per_ctr.property("prototype").setProperty("myPrint",eng->newFunction(Person_prototype_toString));
 eng->globalObject().setProperty("Person",per_ctr);
...

If I try to evaluate the following code in JavaScript

var p = new Person("Guido");
p.toString();
p.myPrint();

I should obtain:

Guido
Guido

instead what I really obtain is a white string from the toString function (probabily is calling the Object.toString function) and a “Interpreter Error: line 2: TypeError: Result of expression ‘p.myPrint’ [undefined] is not a function.” error message from myPrint. I suppose that I didn’t connect correctly the two functions to the Person prototype even if I tried to follow litteraly the documentation pages…PLEASE Could someone explains me what is my fault?!? Thanks!

A: 

what happens if you remove the brackets after toString and myPrint?

if I remove the bracketsvar p = new Person("Guido");p.toString;p.myPrint;I have no error messages but I have not GuidoGuido like I was expecting but an empty string...
Guido
return e->toScriptValue(Person());shouldnt it bereturn e->toScriptValue(Person(x));?
thanks for the notification! unfortunately it is not the problem... :( it continues to act in the same way (white string from toString and error message from myPrint)
Guido
how about qDebug() << qPrintable(per->nm);looks like qDebug() is a constructorhttp://doc.qt.nokia.com/4.6/qdebug.html#QDebug-2
no changes....but really really thanks for your efforts :)
Guido
f I try to check the presence of the property myPrint from the C++ side withper_ctr.property("prototype").property("myPrint").call();the function is called (even if it clearly crashes because it’s not called on a valid object). But this means that at least in the c++ side of the application the myPrint function exists in the Person’s prototype. I cannot say the same thing in the JavaScript side when i get an Interpreter Error: line 2: TypeError: Result of expression ‘v.myPrint’ [undefined] is not a function.
Guido
A: 

Shouldn't:

Person* per = qscriptvalue_cast(c->thisObject());

be:

Person per = qscriptvalue_cast(c->thisObject());
gillis