Коллеги,
мне в проекте Qt требуется исполнение скриптов на JavaScript (выполнение различных настраиваемых проверок, вычисляемые переменные и т.д.). Раньше для этих задач использовал PythonQt, теперь хочу переключиться на QJSEngine. Вроде, все хорошо, но споткнулся на простой вещи - в скрипте мне нужно в качестве возвращаемого значения использовать объект моего типа, например:
Javascript
var v = myObj.val(777);
v.value;
v.alarm;
Для этого я в C++ объявляю два класса: враппер MyObject, объект которого добавляется в проперть движка QJSEngine:
C++ (Qt)
myObj = new MyObject();
QJSValue jmyObj = myEngine->newQObject(myObj);
myEngine->globalObject().setProperty("myObj", jmyObj);
и класс возвращаемого значения MyValue, добавляемый в метаобъектную модель и в проперти движка:
C++ (Qt)
QJSValue jsMyValue = myEngine->newQMetaObject(&MyValue::staticMetaObject);
myEngine->globalObject().setProperty("MyValue", jsMyValue);
Понятно, что оба класса объявляются со всей мутотой типа Q_INVOKABLE, набором конструкторов по умолчанию, копирования, оператором присваивания, регистрацией метатипов - все это можно посмотреть в присоединенном проекте.
Но вот незадача: если в том самом методе MyObject::val, который я вызываю в js, возвращается значение:
C++ (Qt)
Q_INVOKABLE MyValue val(int value) {
return MyValue(value, true);
}
то в скрипте это не работает (свойство v.value дает undefined).
Нашел в Интернете одну единственную подсказку - метод должен возвращать указатель:
C++ (Qt)
Q_INVOKABLE MyValue* val(int value) {
return new MyValue(value, true);
}
Тогда все нормально, и вышеприведенный js код работает. Но возникает сразу несколько вопросов:
1) где прочитать объяснения про то, как нужно объявлять методы с возвратом объекта пользовательского типа?
2) напрягает этот new - как избежать утечки памяти? Моя программа работает непрерывно месяцами, при этом вызовы скриптов выполняются постоянно. Сомневаюсь, что этим занимается QJSEngine - даже если использовать parent при создании MyValue, то объект MyObject живет постоянно в течение всего цикла работы программы;
3) а как вообще со сборкой мусора у QJSEngine , можно ли его вообще использовать в программах, скрипты запускаются постоянно в течение длительного времени?
Прошу прощения за пространное объяснение, но, может, кому-то пригодится...