我正在阅读Qt Scripting的文档,并且如果错误的指导文本,它会完全令人困惑和充实.有些人可以用简单的英文解释如何包装一个函数并在包装后在脚本代码中访问它.我在下面列举了我的例子.包装功能.这是一个简单的包装器,我需要返回作为参数传递的字符串.以下是代码.
#include <QApplication>
#include <QtScript/QScriptEngine>
#include <QtScript/QScriptContext>
#include <QDebug>
QScriptValue returnProperty(QScriptContext *context , QScriptEngine *engine)
{
qDebug() << "running returnValues Function "<< context->argument(0).toString();
return context->thisObject().property("returnValue");
}
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
QScriptEngine engine;
//Evaluating a simple expression
qDebug() << engine.evaluate("1+2").toNumber();
QScriptValue func = engine.globalObject();
func.setProperty("foo",engine.newFunction(returnProperty),QScriptValue::PropertyGetter);
engine.evaluate("var v= foo('name') ; print( 'This prints values from addValues function :',v) ;");
}
Run Code Online (Sandbox Code Playgroud)
输出如下
3
Running returnValues Function "undefined"
Run Code Online (Sandbox Code Playgroud)
如果我正确理解这是我应该做的,如果我调用engine.newObject(),因为它在doc函数中提到甚至没有被调用.
我在这里得到的是,我在func.setproperty行中分配的属性是什么,一旦我设置它,我可以用属性foo做什么.如何在函数中设置值.
如果有人在这里解释我做错了什么,我感激不尽.
你已经走在正确的轨道上了.QScriptEngine::newFunction()将功能带入引擎.现在,您需要一种从脚本访问此功能的方法."function"只是全局对象的一个属性,您可以使用添加新属性setProperty().代码
QScriptValue globalObject = engine.globalObject();
QScriptValue func = engine.newFunction(returnProperty);
globalObject.setProperty("foo", func);
Run Code Online (Sandbox Code Playgroud)
产生输出
3
running returnValues Function "name"
This prints values from addValues function : name
Run Code Online (Sandbox Code Playgroud)
只有当你想创建一个属性时才需要标志QScriptValue::PropertyGetter,QScriptValue::PropertySetter这个属性必须在访问时调用一个函数.它类似于的属性QObject.考虑这个例子:
class MyObject : public QObject
{
Q_PROPERTY(QString name READ getName WRITE setName)
};
MyObject* obj = new MyObject;
Run Code Online (Sandbox Code Playgroud)
当你做一个obj->setProperty("name", "Sam");你MyObject::setName("Sam")在后台打电话,obj->getProperty("name")是一个包装MyObject::getName().一个小例子:
QScriptValue getName(QScriptContext* ctx, QScriptEngine* eng)
{
// Return the value of the internal '_name_' property.
qDebug() << "Getter 'getName' called";
return ctx->thisObject().property("_name_");
}
QScriptValue setName(QScriptContext* ctx, QScriptEngine* eng)
{
// Do some processing and store the name in an internal '_name_' property.
qDebug() << "Setter 'setName' called";
ctx->thisObject().setProperty("_name_",
ctx->argument(0).toString().toUpper());
return QScriptValue::UndefinedValue;
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QScriptEngine engine;
QScriptValue globalObject = engine.globalObject();
// Create a new object.
QScriptValue obj = engine.newObject();
// Bring the functions into the engine.
QScriptValue getNameFunc = engine.newFunction(getName);
QScriptValue setNameFunc = engine.newFunction(setName);
// Create a 'name' property, which calls the getter and setter from above.
obj.setProperty("name", getNameFunc, QScriptValue::PropertyGetter);
obj.setProperty("name", setNameFunc, QScriptValue::PropertySetter);
// Make the new object known as 'person'.
globalObject.setProperty("person", obj);
// Test our construct.
engine.evaluate("print('Set the name to fitzgerald');");
engine.evaluate("person.name = 'fitzgerald';");
engine.evaluate("print('And the name is... ' + person.name)");
}
Run Code Online (Sandbox Code Playgroud)
最后输出:
Set the name to fitzgerald
Setter 'setName' called
Getter 'getName' called
And the name is... FITZGERALD
Run Code Online (Sandbox Code Playgroud)