Harrix Блог

  • Списки статей
    • Все статьи
    • IT
    • Qt
    • C++
    • Сложение двух чисел
    • Web программированиe
    • FAQ
    • Latex
    • Установка программ
    • Мифы
    • Видео
    • Про фото
  • Проекты
  • Harrix.org
  • RSS
  • Контакты

Интерпретатор функций в Qt - QJSEngine

Стандартный интерпретатор в Qt: QtScript устарел. Теперь вместо него QJSEngine. В статье рассказывается, как с ним работать при вычислении выражений.

23.03.2016 Leave a Comment 5 531 просмотров

Стандартный интерпретатор в Qt (QtScript) устарел. Теперь вместо него QJSEngine. В статье рассказывается, как с ним работать при вычислении выражений.

Статья по содержанию совпадает со статьей, где рассказывается про QtScript.

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

Постановка задачи: У нас в переменной типа QString записан код пользовательской функции: y(x)=sin(x)+1. Надо посчитать значение функции в этой точке.

Для объяснения буду использовать простое приложение в Qt на Qt Widgets. Как его создать описано в статье Базовое приложение в Qt Widgets (Qt GuiApplication).

Процесс

  1. Вначале нужно прописать в файле проекта .pro факт подключения QML через добавления слова qml. Без этого не будут подключаться заголовочные файлы.
  2. 1
    QT += core gui qml

    2016-03-22_234544

  3. В файле mainwindow.cpp или в том, что вам нужно пропишите подключение библиотеки:
  4. 1
    #include <QJSEngine>

    2016-03-22_234700

  5. А в кнопке пропишите такой код:
  6. 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");

  7. При запуске приложения и нажатии на кнопку получите вот это:
  8. 2016-03-23_011717

  9. Для функции с двумя аргументами (например, z(x,y)=x+y) код будет немного отличаться:
  10. 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");

  11. При запуске получим вот это:
  12. 2016-03-23_011928

Вычисление простого выражения

Если же вам нужно вычислить значение простого выражения без всяких переменных, то всё гораздо проще. Например, вы хотите вычислить пример 2+2\cdot2. Тогда код будет выглядеть так:

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++ функций, но это и естественно.

Более подробную информацию по классу можно узнать в документации.


Статьи по теме:

  1. Интерпретатор функции в Qt - QtScript
  2. Как подключиться к базе данных в Microsoft SQL Server 2012 в Qt
  3. Сложение двух чисел в Qt 5.5.0 на C++ (Qt Quick)
  4. Сложение двух чисел в Qt 5.6.0 на C++ (Qt Quick Controls)

IT C++, Qt, Интерпретатор

© 2014 Harrix