Russian Qt Forum
Сентябрь 29, 2024, 00:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTScript  (Прочитано 6507 раз)
edg3
Гость
« : Апрель 21, 2011, 22:55 »

как вызвать функцию QTScript'a в основной программе QT,которая принимает один параметр, и возвращает его?
« Последнее редактирование: Апрель 22, 2011, 00:15 от edg3 » Записан
Denjs
Гость
« Ответ #1 : Апрель 22, 2011, 00:09 »

ассистант. статьи раздела QScriptEngine и рядом с ними. Там есть примеры.
не?

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

Ещё Можно погрузить в скриптовый движок ваш объект и просто запустить скрипт, который с ним поработает.
Ещё Можно погрузить в скрипт ваш объект, подключить его сигнал к обработчику-функции написанной на скрипте, и испустить сигнал.
« Последнее редактирование: Апрель 22, 2011, 00:16 от Denjs » Записан
edg3
Гость
« Ответ #2 : Апрель 22, 2011, 00:18 »

не смог разобраться, как из файла скрипта все считать.
Записан
Denjs
Гость
« Ответ #3 : Апрель 22, 2011, 00:19 »

вы не можете прочитать содержимое файла в QString ?
Записан
Denjs
Гость
« Ответ #4 : Апрель 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() можно подключить сигнал  непосредственно к функции внутри скрипта, но с этим я не эксперементировал.
Может что-то и напутал... не обессудьте, писал по быстрому...
« Последнее редактирование: Апрель 22, 2011, 01:00 от Denjs » Записан
Denjs
Гость
« Ответ #5 : Апрель 22, 2011, 01:09 »

но на самом деле все ещё проще.
читаем статью ассистанта про QScriptValue::call()

Идеально ваш пример:  Смеющийся

Код:
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

читать ассистант! ковырять его до посинения!!!!! ВСЕЕМ!!!! Смеющийся
Записан
edg3
Гость
« Ответ #6 : Апрель 24, 2011, 15:14 »

Спс, за помощь, но ещё одно)

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

зы. предполагалось, чтобы я в программе ввел функцию, она запишется в скрипт файл, и вызовет скрипт программа.
Записан
asvil
Гость
« Ответ #7 : Апрель 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");
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.073 секунд. Запросов: 21.