Harrix Блог

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

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

Возникла потребность в интерпретаторе простых функций в среде Qt. Например, у вас программа, где пользователь может сам ввести свою функцию, которая что-то считает (например, sin(x)). Как быть?

19.05.2014 Leave a Comment 10 436 просмотров

Возникла потребность в интерпретаторе простых функций в среде Qt. Например, у вас программа, где пользователь может сам ввести свою функцию, которая что-то считает (например, sin(x)). Как быть? В Qt есть хороший встроенный язык QtScript как раз для этих нужд. Единственно, что синтаксис у него под javascript, хотя мне больше по душе был бы C++, но ладно.

Внимание! В статье рассказываются аналогичные вещи про QJSEngine — заменитель QtScript.

При написании статьи и изучении материла использовался материал статьи Cистема плагинов Qt, построение графиков и Qt Script.

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

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

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

Процесс

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

    1

    0

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

    2

  5. А в кнопке пропишите такой код:
  6. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    //Подготовка
        double x=2;//в какой точки ищем значение функции
        QString CodeFunction="RESULT = Math.sin(x);RESULT = RESULT + 1;";
     
        //Необходимые переменные
        double Result;
        QScriptEngine engine;
        QScriptValue scriptFun;
     
        //подготовка движка QtScript
        engine.evaluate("function fun(x)\n {\n var RESULT=0;\n"+CodeFunction+"\n return RESULT;\n}\n");
        scriptFun = engine.globalObject().property("fun");
     
        //Вычисление значения функции в точке
        Result = scriptFun.call(QScriptValue(), QScriptValueList() << x).toNumber();
     
        ui->textEdit->insertPlainText(QString::number(Result)+"\n");

    3

  7. При запуске приложения и нажатии на кнопку получите вот это:
  8. 4

  9. Для функции с двумя аргументами (например, z(x,y)=x+y) код будет немного отличаться:
  10. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
        //Подготовка
        double x=2, y=3;//в какой точки ищем значение функции
        QString CodeFunction="RESULT = x+y;";
     
        //Необходимые переменные
        double Result;
        QScriptEngine engine;
        QScriptValue scriptFun;
     
        //подготовка движка QtScript
        engine.evaluate("function fun(x,y)\n {\n var RESULT=0;\n"+CodeFunction+"\n return RESULT;\n}\n");
        scriptFun = engine.globalObject().property("fun");
     
        //Вычисление значения функции в точке
        Result = scriptFun.call(QScriptValue(), QScriptValueList() << x << y).toNumber();
     
        ui->textEdit->insertPlainText(QString::number(Result)+"\n");

    5

  11. При запуске получим вот это:
  12. 6

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

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

1
2
3
4
5
6
7
QString CodeFunction="2+2*2";
 
QScriptEngine engine;
 
double Result = engine.evaluate(CodeFunction).toNumber();
 
ui->textEdit->insertPlainText(QString::number(Result)+"\n");

Вот и всё пока) Вы можете спокойно вводить тексты функций на языке QtScript (для простых вычислений как javascript) через файлы, поля ввода и использовать как функции в своих вычислениях. Конечно, работа таких функций будет поменьше, чем у обычных, прописанных на С++ внутри программы, но это и естественно.


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

  1. Интерпретатор функций в Qt - QJSEngine
  2. Базовое приложение в Qt Widgets (Qt GuiApplication)
  3. Как вывести данные в tableView в Qt
  4. Статьи из цикла «Сложение двух чисел»

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

© 2014 Harrix