Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How incapsulate JS example "Calculator" ?
Forum Updated to NodeBB v4.3 + New Features

How incapsulate JS example "Calculator" ?

Scheduled Pinned Locked Moved Solved General and Desktop
findchild js
2 Posts 1 Posters 221 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    JohnZX
    wrote on last edited by
    #1

    Hi !
    Now I have my simple class

    // In HPP
    
    class fpUI : public QDialog
    {
        Q_OBJECT
    
    public:
    
        Q_INVOKABLE fpUI(int id, MainWindow *parent = nullptr, Qt::WindowFlags f = Qt::Widget);
        fpUI(QDomNode item, MainWindow *parent = nullptr, Qt::WindowFlags f = Qt::Widget);
        ~fpUI();
    
        MainWindow	*getParent()  { return mParent; }
    
    public slots:
    signals:
        void keyPressed(int key, int mod);  // For Qt Script
    
    protected:
        int Idd;   // This Idd
        QString objName;
        MainWindow *mParent;
        QScriptEngine   *engine;
        QWidget         *formUI;        // == This UI 
    
    protected slots:
        void on_labelPress();
        void on_buttonPress();
        void initUI(QDomNode item);
        void closeEvent(QCloseEvent *event);
        void keyPressEvent (QKeyEvent *event);
    };
    
    // In CPP
    
    fpUI::fpUI(QDomNode item, MainWindow *parent, Qt::WindowFlags f)
           : QDialog(parent, f)
    {
        mParent = parent;
        Idd = item.toElement().attribute("id").toInt();
        initUI(item);
    }
    
    // construct UI
    void fpUI::initUI(QDomNode item)
    {
        formUI = nullptr;
    
        if (item.nodeName() != getTagByClass(md_forma)) // forma
        {
            QMessageBox::warning(this, tr("ProGramm"), tr("Is Not UI Object !!!"));
            return;
        }
    
        objName = QString("Frm%0").arg(Idd);
        setObjectName(objName);
    
        engine = mParent->getEngine();
    
        QDomElement frmo = item.firstChildElement(getTagByClass(md_dialogform));  // dialogform
        QDomElement scro = item.firstChildElement(getTagByClass(md_sourcecode));  // sourcecode
    
        // Load Dialog Form from Resource !!!
        formUI = mParent->loadResource(frmo, dynamic_cast<QWidget *>(this)); 
        if (!formUI)
        {
            QMessageBox::information(this, tr("ProGramm"), tr("Error load UI !"));
            return;
        }
    
        setGeometry(formUI->geometry());
        setWindowTitle(formUI->windowTitle());
        setFont(formUI->font());
    
        QScriptValue global = engine->globalObject();
    
        // Register this Object in JS !!!
        QScriptValue valUI = engine->newQObject(formUI,  QScriptEngine::ScriptOwnership);
    
      // Load JS module and evaluate it in Object "objName" Context !!!
      // Context is Important !!!
      QScriptValue scrUI = mParent->loadScript(scro, objName);
    
    // In Calculator example is :
    ////! [2]
    //    QScriptValue ctor = engine.evaluate("Calculator");
    //    QScriptValue scriptUi = engine.newQObject(ui, QScriptEngine::ScriptOwnership);
    //    QScriptValue calc = ctor.construct(QScriptValueList() << scriptUi);
    ////! [2]
    }
    

    As in result in JS will be created QDialog Object with it's Script inside.
    In Script we write:

    var le = this.findChild("leSuma")	// Line Edit Suma
    

    In Calculator example we can write::

    // field Suma direct, with not need call findChild("leSuma")  !!!  Important !!!
    var le = this.ui.leSuma	
    

    My question - How i can direct access to control members in JS fpUI Object like in Calculator example, with out call findChild("") ?

    Thx advance !!!

    J 1 Reply Last reply
    0
    • J JohnZX

      Hi !
      Now I have my simple class

      // In HPP
      
      class fpUI : public QDialog
      {
          Q_OBJECT
      
      public:
      
          Q_INVOKABLE fpUI(int id, MainWindow *parent = nullptr, Qt::WindowFlags f = Qt::Widget);
          fpUI(QDomNode item, MainWindow *parent = nullptr, Qt::WindowFlags f = Qt::Widget);
          ~fpUI();
      
          MainWindow	*getParent()  { return mParent; }
      
      public slots:
      signals:
          void keyPressed(int key, int mod);  // For Qt Script
      
      protected:
          int Idd;   // This Idd
          QString objName;
          MainWindow *mParent;
          QScriptEngine   *engine;
          QWidget         *formUI;        // == This UI 
      
      protected slots:
          void on_labelPress();
          void on_buttonPress();
          void initUI(QDomNode item);
          void closeEvent(QCloseEvent *event);
          void keyPressEvent (QKeyEvent *event);
      };
      
      // In CPP
      
      fpUI::fpUI(QDomNode item, MainWindow *parent, Qt::WindowFlags f)
             : QDialog(parent, f)
      {
          mParent = parent;
          Idd = item.toElement().attribute("id").toInt();
          initUI(item);
      }
      
      // construct UI
      void fpUI::initUI(QDomNode item)
      {
          formUI = nullptr;
      
          if (item.nodeName() != getTagByClass(md_forma)) // forma
          {
              QMessageBox::warning(this, tr("ProGramm"), tr("Is Not UI Object !!!"));
              return;
          }
      
          objName = QString("Frm%0").arg(Idd);
          setObjectName(objName);
      
          engine = mParent->getEngine();
      
          QDomElement frmo = item.firstChildElement(getTagByClass(md_dialogform));  // dialogform
          QDomElement scro = item.firstChildElement(getTagByClass(md_sourcecode));  // sourcecode
      
          // Load Dialog Form from Resource !!!
          formUI = mParent->loadResource(frmo, dynamic_cast<QWidget *>(this)); 
          if (!formUI)
          {
              QMessageBox::information(this, tr("ProGramm"), tr("Error load UI !"));
              return;
          }
      
          setGeometry(formUI->geometry());
          setWindowTitle(formUI->windowTitle());
          setFont(formUI->font());
      
          QScriptValue global = engine->globalObject();
      
          // Register this Object in JS !!!
          QScriptValue valUI = engine->newQObject(formUI,  QScriptEngine::ScriptOwnership);
      
        // Load JS module and evaluate it in Object "objName" Context !!!
        // Context is Important !!!
        QScriptValue scrUI = mParent->loadScript(scro, objName);
      
      // In Calculator example is :
      ////! [2]
      //    QScriptValue ctor = engine.evaluate("Calculator");
      //    QScriptValue scriptUi = engine.newQObject(ui, QScriptEngine::ScriptOwnership);
      //    QScriptValue calc = ctor.construct(QScriptValueList() << scriptUi);
      ////! [2]
      }
      

      As in result in JS will be created QDialog Object with it's Script inside.
      In Script we write:

      var le = this.findChild("leSuma")	// Line Edit Suma
      

      In Calculator example we can write::

      // field Suma direct, with not need call findChild("leSuma")  !!!  Important !!!
      var le = this.ui.leSuma	
      

      My question - How i can direct access to control members in JS fpUI Object like in Calculator example, with out call findChild("") ?

      Thx advance !!!

      J Offline
      J Offline
      JohnZX
      wrote on last edited by JohnZX
      #2

      @JohnZX SOLVED

      Change
      ctor.construct(QScriptValueList() << scriptUi);
      To
      QScriptValue valApp = engine->globalObject().property(objName);
      ctor.call(valApp, QScriptValueList() << scriptUi);

      1 Reply Last reply
      0

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved