- 1. Projektstruktur
- 2. Widget.ui
- 3. Widget.h
- 4. Widget.cpp
- 5. Fazit
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).