Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: edg3 от Апрель 21, 2011, 22:55



Название: QTScript
Отправлено: edg3 от Апрель 21, 2011, 22:55
как вызвать функцию QTScript'a в основной программе QT,которая принимает один параметр, и возвращает его?


Название: Re: QTScript
Отправлено: Denjs от Апрель 22, 2011, 00:09
ассистант. статьи раздела QScriptEngine и рядом с ними. Там есть примеры.
не?

Код:
 QScriptEngine myEngine;
 QScriptValue three = myEngine.evaluate("1 + 2");

Ещё Можно погрузить в скриптовый движок ваш объект и просто запустить скрипт, который с ним поработает.
Ещё Можно погрузить в скрипт ваш объект, подключить его сигнал к обработчику-функции написанной на скрипте, и испустить сигнал.


Название: Re: QTScript
Отправлено: edg3 от Апрель 22, 2011, 00:18
не смог разобраться, как из файла скрипта все считать.


Название: Re: QTScript
Отправлено: Denjs от Апрель 22, 2011, 00:19
вы не можете прочитать содержимое файла в QString ?


Название: Re: QTScript
Отправлено: Denjs от Апрель 22, 2011, 00:38
Цитировать
зі. если кому интересно, стоит задача построить график по заданной формуле. Для построения графика использую Qwt, а чтобы не писать парсер, решил просто вызывать функцию Lua, где будет записана форуме по которой считать.
вы эту задачу пытаетесь решить?

погрузите в скриптовый движок объект который будет связующим звеном между вашей программой и скриптом.
У объекта пусть будет сигнал calculate(int x), и слот result(int x, int y)
Код:
class myProxy(.... ) 
: QObject(..... )
{
Q_OBJECT
...
public:
...
 callF(int x) {emit calculate(x);};
 
signals:
 void calculate(int x);
...
public slots:
 void result(int x, int y)
}

Код:
QScriptEngine myEngine;
myProxy myObject;
myEngine.globalObject().setProperty("myObj", myEngine.newQObject(&myObject));
QString myScript = " function myCalculate(x) { myObj.result(x, x*2); return 0; }; myObj.calculate.connect(myCalculate);"
myEngine.evaluate(myScript);

Теперь, в принципе пока вы не уничтожите myEngine, вызов в основной программе myObject.callF()  будет приводить к обмену сигналами и вызову у вашего объекта слота result()...
там надо перечитать насчет того, с какой момент скриптовый движок считает что скрипт закончил работу, и как его убедить не прерывать "исполнение" скрипта пока нам надо...

Как я понимаю, через qScriptConnect() можно подключить сигнал  непосредственно к функции внутри скрипта, но с этим я не эксперементировал.
Может что-то и напутал... не обессудьте, писал по быстрому...


Название: Re: QTScript
Отправлено: Denjs от Апрель 22, 2011, 01:09
но на самом деле все ещё проще.
читаем статью ассистанта про QScriptValue::call()

Идеально ваш пример:  ;D

Код:
QScriptEngine engine;
 engine.evaluate("function cube(x) { return x * x * x; }");

 QScriptValue global = engine.globalObject();

 QScriptValue cube = global.property("cube");
 QScriptValueList args;
 args << 3;

 qDebug() << cube.call(QScriptValue(), args).toNumber(); // 27

читать ассистант! ковырять его до посинения!!!!! ВСЕЕМ!!!! ;D


Название: Re: QTScript
Отправлено: edg3 от Апрель 24, 2011, 15:14
Спс, за помощь, но ещё одно)

как сделать чтобы в функция синуса в QTSript вызывалась не как Math.sin() а просто sin() ?

зы. предполагалось, чтобы я в программе ввел функцию, она запишется в скрипт файл, и вызовет скрипт программа.


Название: Re: QTScript
Отправлено: asvil от Апрель 25, 2011, 09:19
Один из способов.
Код:
QScriptEngine engine;
QScriptValue global = engine.globalObject();
QScriptValue sin = global.property("Math").property("sin");
global.addProperty("sin", sin);
Второй из способов, это первый перенесенные в script окружение:
Код:
QScriptEngine engine;
engine.evaluate("sin = Math.sin");