Стандартный интерпретатор в Qt (QtScript) устарел. Теперь вместо него QJSEngine. В статье рассказывается, как с ним работать при вычислении выражений.
Статья по содержанию совпадает со статьей, где рассказывается про QtScript.
Мы будем рассматривать простые математические пользовательские функции с одной и двумя переменными. По аналогии с ними вы сможете модифицировать код под себя.
Постановка задачи: У нас в переменной типа QString записан код пользовательской функции: . Надо посчитать значение функции в этой точке.
Для объяснения буду использовать простое приложение в Qt на Qt Widgets. Как его создать описано в статье Базовое приложение в Qt Widgets (Qt GuiApplication).
Процесс
- Вначале нужно прописать в файле проекта .pro факт подключения QML через добавления слова qml. Без этого не будут подключаться заголовочные файлы.
- В файле mainwindow.cpp или в том, что вам нужно пропишите подключение библиотеки:
- А в кнопке пропишите такой код:
- При запуске приложения и нажатии на кнопку получите вот это:
- Для функции с двумя аргументами (например,
) код будет немного отличаться:
- При запуске получим вот это:
1 |
QT += core gui qml |
1 |
#include <QJSEngine> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//Подготовка double x=2;//в какой точки ищем значение функции QString CodeFunction="r = Math.sin(x);r = r + 1;"; //Необходимые переменные double result; QJSEngine myEngine; QJSValueList args; //подготовка движка QJSValue fun = myEngine.evaluate("(function fun(x) { var r=0;"+CodeFunction+" return r;})"); //Закидываем аргументы функции args << x; //Вычисление значения функции в точке QJSValue value = fun.call(args); result = value.toNumber(); ui->textEdit->insertPlainText(QString::number(result)+"\n"); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//Подготовка double x=2, y=3;//в какой точки ищем значение функции QString CodeFunction="r = x + y;"; //Необходимые переменные double result; QJSEngine myEngine; QJSValueList args; //подготовка движка QJSValue fun = myEngine.evaluate("(function fun(x,y) { var r=0;"+CodeFunction+" return r;})"); //Закидываем аргументы функции args << x << y; //Вычисление значения функции в точке QJSValue value = fun.call(args); result = value.toNumber(); ui->textEdit->insertPlainText(QString::number(result)+"\n"); |
Вычисление простого выражения
Если же вам нужно вычислить значение простого выражения без всяких переменных, то всё гораздо проще. Например, вы хотите вычислить пример . Тогда код будет выглядеть так:
1 2 3 4 5 6 7 8 9 |
QString CodeFunction="2+2*2"; QJSEngine myEngine; QJSValue value = myEngine.evaluate(CodeFunction); double result = value.toNumber(); ui->textEdit->insertPlainText(QString::number(result)+"\n"); |
Вот и всё пока) Вы можете спокойно вводить тексты функций на языке javascriptчерез файлы, поля ввода и использовать как функции в своих вычислениях. Конечно, скорость работы таких функций будет поменьше, чем у обычных C++ функций, но это и естественно.
Более подробную информацию по классу можно узнать в документации.