Member 13020023 Ответов: 1

Qt C++ - как определить пользовательские функции в qjsengine


Я пытаюсь сделать калькулятор с помощью QJSEngine, и мне нужны такие функции, как sqrt, pow, ln, sin и т. д. В QScript вы можете определить пользовательские функции с помощью нескольких простых строк кода, но я понятия не имею, как я могу достичь этого в QJSEngine.

Что я уже пробовал:

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

1 Ответов

Рейтинг:
0

Jochen Arndt

Согласно документации и примерам на сайте Класс QJSEngine | Qt QML 5.11[^] вы можете передать функцию в виде строки в evaluate() и исполнить приказ call() способ возврата Класс QJSValue | Qt QML 5.11[^]:

QJSEngine myEngine;
QJSValue fun = myEngine.evaluate("(function(a, b) { return a + b; })");
QJSValueList args;
args << 1 << 2;
QJSValue threeAgain = fun.call(args);


Member 13020023

Что делать, если мне нужно выполнить функцию внутри программы, которая оценивается? Например, я определяю функцию, которая возвращает факториал числа, называемого myFactorialFunc. Теперь, когда я набираю call evaluate("myFactorialFunc(4)"), я ожидаю, что результат будет равен 24.

Jochen Arndt

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

Я еще не пробовал, но в вашем случае вы должны загрузить свой скрипт, как показано в документации по моей ссылке, а затем вызвать функции, определенные в скрипте, с помощью другого вызова evaluate (), используя имя функции и параметры. Но обратите внимание, что параметры в этом случае не могут быть переданы по значению (являются частью строки).