Evgenii Legotckoi
Evgenii Legotckoi11. Oktober 2018 14:04

Qt/C++ - Tutorial 084. Ausführen von JavaScript-Code in einer C++-Anwendung am Beispiel der Arbeit mit zwei Variablen

Angenommen, Sie stehen vor der Aufgabe, JavaScript-Code in einer C++-Anwendung auszuführen. Beispielsweise gibt es eine Reihe von Ausgabedaten oder Variablen, deren Namen im Voraus bekannt sind, und es gibt auch Teile von JavaScript-Code, die etwas mit diesen Variablen tun. Darüber hinaus gibt es auch einen Algorithmus, der bei Vorliegen beliebiger Bedingungen auswählt. welcher JavaScript-Code ausgeführt werden soll.

Außerdem können Sie diesen JavaScript-Code nicht einfach in C++-Code umschreiben und ihn der Anwendung hinzufügen. Da es viele solcher Codeteile gibt, sind andere Personen daran beteiligt, sie zu pflegen und ständig neue Codeteile hinzuzufügen.

Das heißt, in diesem Fall sind der Eingabedatensatz und der JavaScript-Code für uns Daten, gewissermaßen die Inhalte, die wir mit einem bestimmten Algorithmus in Betrieb setzen, nach dem wir unter welchen Bedingungen für denselben Satz von Eingabevariablen auswählen um den einen oder anderen JavaScript-Code auszuwählen.

Ich hoffe, ich habe deutlich gemacht, warum wir JavaScript-Code in einer C++-Anwendung ausführen müssen.

Ich schlage vor, eine Anwendung zu schreiben, die zwei Eingabefelder für Variablennamen hat, zwei Eingabefelder mit Eingabe der Werte dieser Variablen im Double-Format , falls ein anderer Wert als das Double* eingegeben wird * Datentyp, setzen wir den Wert der Variablen auf Undefined** .

Wir werden auch ein TextEdit -Eingabefeld zum Schreiben von JavaScript -Code hinzufügen, den wir in unserer Anwendung ausführen werden.

Und das letzte Eingabefeld heißt Ergebnis (es wird TextEdit), das für die Anzeige der neu berechneten Werte der von uns eingegebenen Variablen verantwortlich ist.

Wir werden auch QPushButton hinzufügen, das die Ausführung von JavaScript-Code auslöst.

Die Anwendung sieht wie im Bild unten aus.


Projektstruktur

Lassen Sie uns ein Projekt mit einer minimalen Struktur schreiben. Tatsächlich hat das Projekt eine Struktur, die standardmäßig erstellt wird.

Der einzige wichtige Unterschied zum Standardprofil besteht darin, dass wir das script -Modul einbinden müssen.

Dies geschieht in der Datei JSCalculation.pro .

QT       += core gui widgets script

Widget.ui

In diesem Artikel werde ich nicht beschreiben, wie ich das Bewerbungsformular in Qt Designer erstellt habe, das ist für uns nicht so wichtig und trifft nicht auf das Thema des Artikels zu. Ich werde nur die Objekte auflisten, die in den Quellcodes des Widgets mit dem Namen ihrer Klasse verwendet werden

  • nameLineEdit_1 - QLineEdit
  • nameLineEdit_2 - QLineEdit
  • valueLineEdit_1 - QLineEdit
  • valueLineEdit_2 - QLinEdit
  • execPushButton - QPushButton
  • javaScriptTextEdit - QPlainTextEdit
  • resultTextEdit - QPlainTextEdit

Und jetzt gehen wir direkt zur Umsetzung unseres Projekts über.

Widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    // Всё по умолчанию, кроме этого слота, который выполнит JavaScript и посчитает переменные
    void onExecPushButtonClicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

Widget.cpp

Und jetzt der Anwendungscode selbst

#include "Widget.h"
#include "ui_Widget.h"

// Нам понадобяться следующие классы
#include <QScriptEngine>
#include <QScriptContext>
#include <QScriptValue>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(ui->execPushButton, &QPushButton::clicked, this, &Widget::onExecPushButtonClicked);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::onExecPushButtonClicked()
{
    // Создадим объект движка JavaScript
    QScriptEngine engine;
    // Возьмём из него контекст, в котором будем работать
    // В данном случае создаётся новый контекст
    QScriptContext* context = engine.pushContext();

    // Возьмём имена переменных, с которыми должны работать
    const QString var_1 = ui->nameLineEdit_1->text();
    const QString var_2 = ui->nameLineEdit_2->text();

    // Установим переменные, попытавшись сконвертировать текст QLineEdit полей в double
    bool ok = false;

    double value = ui->valueLineEdit_1->text().toDouble(&ok);
    if (ok)
    {
        // Устанавливаем переменные со значением в качестве свойств объекта активации скрипта
        context->activationObject().setProperty(var_1, value);
    }
    else
    {
        // Если конвертация не удалась, то значение будет Undefined
        context->activationObject().setProperty(var_1, QScriptValue::UndefinedValue);
    }

    value = ui->valueLineEdit_2->text().toDouble(&ok);
    if (ok)
    {
         // Устанавливаем переменные со значением в качестве свойств объекта активации скрипта
        context->activationObject().setProperty(var_2, value);
    }
    else
    {
        // Если конвертация не удалась, то значение будет Undefined
        context->activationObject().setProperty(var_2, QScriptValue::UndefinedValue);
    }

    // Запускаем выполнение скрипта
    engine.evaluate(ui->javaScripTextEdit->toPlainText());

    // Очищаем поле вывада результата от предыдущих значений
    ui->resultTextEdit->clear();
    // Выводим текущее состояние переменных
    ui->resultTextEdit->appendPlainText(var_1 + " = " + context->activationObject().property(var_1).toString());
    ui->resultTextEdit->appendPlainText(var_2 + " = " + context->activationObject().property(var_2).toString());

    // Удаляем контекст
    engine.popContext();

    // Поскольку QScriptEngine создан на стеке метода, то он удалится автоматически по завершении метода
}

Fazit

Sie können zuerst die Variablennamen und ihre Werte eingeben, um sicherzustellen, dass alles ohne JavaScript-Code funktioniert.

Außerdem sollte die Anwendung nicht abstürzen und mit Fehlern beendet werden. Wenn der JavaScript-Code, den Sie eingeben und wie ganz am Anfang des Artikels gezeigt wird, nicht das Ergebnis liefert, das Sie erwarten, dann sollten Sie sich Ihren JavaScript-Code wahrscheinlich genauer ansehen, höchstwahrscheinlich haben Sie einen Fehler gemacht. QScriptEngine unterstützt auch einige Standard-JavaScript-Funktionen, wie z. B. die Math-Bibliothek ( Dies funktioniert auch).

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken