Qt QJSEngine рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдПрдоред рд╢рд┐рд▓реЗ рдХреА рдкреБрд╕реНрддрдХ "рдХреНрдпреВрдЯреА рдкреНрд░реЛрдлреЗрд╢рдирд▓ рдХреНрдпреВрдЯреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" "рдЯрд░реНрдЯрд▓ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕" рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдХрд╛рдо рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ "рдХреНрдпреВ рд╕реНрдХреНрд░рд┐рдкреНрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ" рдЦрдВрдб рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯрд░реНрдорд┐рдирд▓ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрджреЗрд╢реЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЙрд╕реА рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ QML рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдХреНрдпреВрдЯреА рдХреНрд╡рд┐рдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ

рдЫрд╡рд┐

рд╣рдо рдлреЙрд░реНрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред Main.qml рдлрд╝рд╛рдЗрд▓:

import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.0 Window { id: window visible: true width: Screen.width/2 height: Screen.height/2 title: qsTr(" jsEnjine") property string consoleFontFamily: "Consolas" property int fontPixelSize: 14 TextArea { id: textAreaLog anchors.bottom: rectangle.top anchors.bottomMargin: 3 anchors.right: parent.right anchors.rightMargin: 3 anchors.left: parent.left anchors.leftMargin: 3 anchors.top: parent.top anchors.topMargin: 3 readOnly: true } Rectangle { id: rectangle height: 25 anchors.right: parent.right anchors.rightMargin: 3 anchors.left: parent.left anchors.leftMargin: 3 anchors.bottom: parent.bottom anchors.bottomMargin: 3 border.color: "#0c0a0a" TextEdit { id: textEditInput anchors.right: parent.right anchors.rightMargin: 5 anchors.left: parent.left anchors.leftMargin: 5 anchors.bottom: parent.bottom anchors.bottomMargin: 5 anchors.top: parent.top anchors.topMargin: 5 font.pixelSize: fontPixelSize } } } 

рдЖрдХрд╛рд░

рдЫрд╡рд┐

AppCore рдФрд░ Console рдХреНрд▓рд╛рд╕ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдереЛрдбрд╝рд╛ main.c рдЬреЛрдбрд╝реЗрдВ

 #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQmlContext> #include "appcore.h" int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); AppCore appCore; QQmlApplicationEngine engine; QQmlContext *context = engine.rootContext();//   //      ,  //    //     context->setContextProperty("appCore",&appCore); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if(engine.rootObjects().isEmpty()) return -1; return app.exec(); } 

appcore.h

 #ifndef APPCORE_H #define APPCORE_H #include <QObject> #include <QJSEngine> #include "console.h" class AppCore : public QObject { Q_OBJECT public: explicit AppCore(QObject *parent = nullptr); private: QJSEngine appScriptEngine; Console *userConsole; signals: Q_INVOKABLE void appEndTextArea(const QString& text); Q_INVOKABLE void clearTextArea(); public slots: Q_INVOKABLE void slotEvaluate(const QString& code); }; #endif // APPCORE_H 

appcore.c

 #include "appcore.h" AppCore::AppCore(QObject *parent) : QObject(parent) { userConsole = new Console(this); QJSValue val = appScriptEngine.newQObject(userConsole); appScriptEngine.globalObject().setProperty("console",val); connect(userConsole, SIGNAL(appEndTextArea(QString)),this,SIGNAL(appEndTextArea(QString))); connect(userConsole, SIGNAL(clearTextArea()),this,SIGNAL(clearTextArea())); } void AppCore::slotEvaluate(const QString& code) { QJSValue result = appScriptEngine.evaluate(code); if(result.isError()){ QString er = QString("   %1: %2").arg(result.property("lineNumber").toInt()).arg(result.toString()); emit appEndTextArea(er); } } 

console.h

 #ifndef CONSOLE_H #define CONSOLE_H #include <QObject> class Console : public QObject { Q_OBJECT public: explicit Console(QObject *parent = nullptr); Q_INVOKABLE void log(const QString& message); Q_INVOKABLE void clear(); signals: Q_INVOKABLE void appEndTextArea(const QString& text); Q_INVOKABLE void clearTextArea(); }; #endif // CONSOLE_H 

console.cpp

 #include "console.h" Console::Console(QObject *parent) : QObject(parent) { } void Console::log(const QString& message) { emit appEndTextArea(message); } void Console::clear() { emit clearTextArea(); } 

AppCore рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ , рд╣рдордиреЗ QJSEngine рдХреЛ рдХрдВрд╕реЛрд▓ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рд╛, рдФрд░ рд╣рдордиреЗ рдпрд╣ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рд╣рдо рдЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ "рдХрдВрд╕реЛрд▓" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдВрдЧреЗред

 QJSValue val = appScriptEngine.newQObject(userConsole); appScriptEngine.globalObject().setProperty("console",val); 

рд╕рд┐рдЧреНрдирд▓ appEndTextArea (const QString & text) - рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
main.qml

рд╕рд┐рдЧреНрдирд▓ рдХреНрд▓рд┐рдпрд░рдЯреЗрдХреНрдЕрд░реЗрдЖ () - text.reaLog рдЯреЗрдХреНрд╕реНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдПрд░рд┐рдпрд╛ рдХреЛ main.qml рдореЗрдВ рдХреНрд▓рд┐рдпрд░ рдХрд░реЗрдВ ред

рд╕реНрд▓реЙрдЯ рд╕реНрд▓реЙрдЯрдПрд╡рд▓рд┐рдХреЗрдЯ (const QString рдФрд░ рдХреЛрдб) - рдореБрдЦреНрдп .qml рдореЗрдВ textEditInput рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП js рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрдиред

рдЖрдЗрдП main.qml рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝реЗрдВ:

 Connections{ target: appCore onAppEndTextArea:{ textAreaLog.cursorPosition = textAreaLog.length; textAreaLog.append(text); } onClearTextArea:{ textAreaLog.cursorPosition=0; textAreaLog.text = ""; } } 

рд╣рдо textEditInput рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрдд рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд╢реВрдиреНрдп рд╕реНрд▓реЙрдЯ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ

 TextEdit { id: textEditInput anchors.right: parent.right anchors.rightMargin: 5 anchors.left: parent.left anchors.leftMargin: 5 anchors.bottom: parent.bottom anchors.bottomMargin: 5 anchors.top: parent.top anchors.topMargin: 5 font.pixelSize: fontPixelSize Keys.onReturnPressed:{ if(textEditInput.text == "")return; appCore.slotEvaluate(text) clear() } Keys.onEscapePressed: clear() } 

рдЕрдм рдЬрдм рдЖрдк textEditInput рдореЗрдВ рдПрдХ рдХрдорд╛рдВрдб рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдВрдЯрд░ рджрдмрд╛рддреЗ рд╣реИрдВ , рддреЛ рдХрдорд╛рдВрдб рдХреЛ AppCore рдореЗрдВ рд╕реНрд▓реЙрдЯрдПрд╡рд▓рд┐рдХреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рдЬрдм рдЖрдк ESC рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ textEditInput рдлрд╝реАрд▓реНрдб рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдо textEditInput рдореЗрдВ рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ ("рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб") рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЯреЗрдХреНрд╕реНрдЯрдПрд░рд┐рдпрд╛рд▓реЙрдЧ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реИрд▓реЛ рджреБрдирд┐рдпрд╛ рджреЗрдЦреЗрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдЕрдЬреНрдЮрд╛рдд QJSEngine рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧреАред

рдЫрд╡рд┐

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдПрдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо QJSEngine рд╕реЗ рдЬреБрдбрд╝реЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдИ рдХрд╣реЗрдЧрд╛ "рдЬреЗрдПрд╕ рдХрд╛ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИ?" рдЖрдЦрд┐рд░рдХрд╛рд░, C ++ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВ? тАЭ , рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рдХрд╣рд╛рдиреА рд╣реИтАж

рдЧрд┐рддреБрдм рдкрд░ рд▓рд┐рдВрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛

Source: https://habr.com/ru/post/hi481142/


All Articles