Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. qmlRegisterType => QML module not found. How to specify the path to the object ?

qmlRegisterType => QML module not found. How to specify the path to the object ?

Scheduled Pinned Locked Moved Solved QML and Qt Quick
19 Posts 4 Posters 7.2k 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.
  • Q Offline
    Q Offline
    Quentin91
    wrote on last edited by
    #7

    Actually, what I'm trying to do is communicating with an already made QML code using this pattern :

    InternalItems.EditGrid {
            objectName: "EditGrid"
            width: widthScene*scale
            height: heightScene*scale
            opacity: 0.2
            z: 1000
            visible: mainModel.gridVisible && mainModel.edition     //this
            resolution: mainModel.gridResolution     //or this
        }
    

    I don't really care about using qmlRegisterType ou my c++ class as a contextProperty with Q_INVOKABLE getters. I just want to be able too give the QML what it asks by mainModel.something. If you do have any recommendation or advice, don't hesitate.

    (protip : when

    /*c++*/engine.rootContext()->setContextProperty("mainModel", &mainModel);
    
    /*c++*/Q_INVOKABLE double MainModelView::get_scale(void){
    	     return _scale;
           }
    
    /*qml*/   property real scale: mainModel.get_scale
    

    it's said unable to assign [undefined] to double

    1 Reply Last reply
    0
    • fcarneyF Offline
      fcarneyF Offline
      fcarney
      wrote on last edited by
      #8

      @Quentin91 said in qmlRegisterType => QML module not found. How to specify the path to the object ?:

      it's said unable to assign [undefined] to double

      property real scale: mainModel.get_scale()
      

      Q_INVOKABLE means you call it like a function. Does adding the () help?

      C++ is a perfectly valid school of magic.

      Q 1 Reply Last reply
      2
      • fcarneyF fcarney

        @Quentin91 said in qmlRegisterType => QML module not found. How to specify the path to the object ?:

        it's said unable to assign [undefined] to double

        property real scale: mainModel.get_scale()
        

        Q_INVOKABLE means you call it like a function. Does adding the () help?

        Q Offline
        Q Offline
        Quentin91
        wrote on last edited by
        #9

        @fcarney I already tried.
        TypeError: property 'get_scale' of object NAMESPACE::MainModelView is not a function

        nice try ;)

        1 Reply Last reply
        0
        • fcarneyF Offline
          fcarneyF Offline
          fcarney
          wrote on last edited by fcarney
          #10

          Wait, where did you specify Q_INVOKABLE? It needs to be in the class definition, not in the cpp file.

          So in your class:

          class MainModelView
          {
          ...
          public:
            Q_INVOKABLE double get_scale(void);
          ...
          };
          

          C++ is a perfectly valid school of magic.

          Q 1 Reply Last reply
          1
          • fcarneyF fcarney

            Wait, where did you specify Q_INVOKABLE? It needs to be in the class definition, not in the cpp file.

            So in your class:

            class MainModelView
            {
            ...
            public:
              Q_INVOKABLE double get_scale(void);
            ...
            };
            
            Q Offline
            Q Offline
            Quentin91
            wrote on last edited by Quentin91
            #11

            @fcarney in both the declarations and definitions... I'll try to delete the Q_INVOKABLE from the cpp

            Same error. The presence of the Q_INVOKABLE at the beginning of the definition doesn't change anything.
            Unable to assign [undefined] to double

            J.HilkJ 1 Reply Last reply
            0
            • fcarneyF Offline
              fcarneyF Offline
              fcarney
              wrote on last edited by
              #12

              I would backup and create a test project with the smallest amount of code. Then share that so we can see what is going on. If I run into something that "should work" I create test projects and test those out. Usually I either find the problem, or have an easy way to show others that there is indeed a problem. There are a lot of things that could cause objects to not be defined at the proper time. Making a minimal example helps other people help you.

              C++ is a perfectly valid school of magic.

              1 Reply Last reply
              0
              • Q Quentin91

                @fcarney in both the declarations and definitions... I'll try to delete the Q_INVOKABLE from the cpp

                Same error. The presence of the Q_INVOKABLE at the beginning of the definition doesn't change anything.
                Unable to assign [undefined] to double

                J.HilkJ Offline
                J.HilkJ Offline
                J.Hilk
                Moderators
                wrote on last edited by
                #13

                @Quentin91
                can you share some more code? preferable something compileable so we can take a closer look at it ;-)


                Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                Q: What's that?
                A: It's blue light.
                Q: What does it do?
                A: It turns blue.

                1 Reply Last reply
                0
                • Q Offline
                  Q Offline
                  Quentin91
                  wrote on last edited by Quentin91
                  #14

                  @J.Hilk said in qmlRegisterType => QML module not found. How to specify the path to the object ?:

                  @Quentin91
                  can you share some more code? preferable something compileable so we can take a closer look at it ;-)

                  @fcarney said in qmlRegisterType => QML module not found. How to specify the path to the object ?:

                  I would backup and create a test project with the smallest amount of code. Then share that so we can see what is going on. If I run into something that "should work" I create test projects and test those out. Usually I either find the problem, or have an easy way to show others that there is indeed a problem. There are a lot of things that could cause objects to not be defined at the proper time. Making a minimal example helps other people help you.

                  Thank you very much for your help

                  Ok, i made a new project in my solution. All the source, header and qml files are in the base folder. Only the executable is in a bin folder.

                  before showing the code, here are the problems. First, when I import my c++ type at the beginning of the qml, QML module not found but I still can launch the program with this error. When I use my type, Error : cannot assign [undefined] to bool

                  Here is miniModel.h

                  #ifndef _MINIMODEL_H_
                  #define _MINIMODEL_H_
                  
                  #include <stdlib.h>
                  #include <stdio.h>
                  #include <iostream>
                  
                  #include <string>
                  
                  #include <QtGui/qguiapplication.h> 
                  #include <QtQml/qqmlcontext.h>
                  #include <QtQml/qqmlapplicationengine.h>
                  #include <QtCore/qdebug.h>
                  #include <QtCore/qobject.h>
                  #include <QtCore/qvariant.h>
                  
                  class MiniModel : public QObject
                  {
                  	Q_OBJECT
                  	Q_PROPERTY(bool miniboule READ getMiniboule WRITE setMiniboule NOTIFY minibouleChanged)
                  public:
                  	MiniModel();
                  
                  	bool getMiniboule();
                  	void setMiniboule(bool bouboule);
                  
                  public slots:
                  signals:
                  	void minibouleChanged();
                  
                  private:
                  	bool m_miniboule;
                  };
                  
                  #endif
                  

                  here is miniModel.cpp

                  #include "miniModel.h"
                  
                  MiniModel::MiniModel():m_miniboule(true)
                  {
                  }
                  
                  bool MiniModel::getMiniboule() {
                  	return m_miniboule;
                  }
                  
                  void MiniModel::setMiniboule(bool bouboule){
                  	m_miniboule = bouboule;
                  	emit minibouleChanged();
                  }
                  

                  main.cpp

                  #include "miniModel.h"
                  
                  int main(int argc=0, char* argv[]=nullptr)
                  {
                  	QGuiApplication app(argc, argv);
                  
                  	qmlRegisterType<MiniModel>("myModel.miniModel", 1, 0, "MiniModel");
                  	QQmlApplicationEngine engine;
                  	engine.addImportPath(QStringLiteral("..\\..\\..\\..\\Tools\\Qt\\5.12.0\\x64\\5.12.0\\msvc2017_64\\qml"));
                  	engine.load(QUrl(QStringLiteral("..\\..\\..\\miniModel.qml")));
                  
                  	return app.exec();
                  }
                  

                  QML code

                  
                  import QtQuick 2.5
                  import QtQuick.Window 2.5
                  import QtQuick.Controls 1.4
                  
                  import myModel.miniModel 1.0//QML module not found
                  ApplicationWindow {
                      id: root
                      width: 300
                      height: 480
                      Text{
                         id: textTest
                         x: 62
                         y: 75
                         color: "#d21616"
                         text:  "vanilla"
                         visible: false
                      }
                      MouseArea{
                          onClicked: testText.visible=  MiniModel.getMiniboule//the boolean I want to acess, defined to true
                      }
                  }
                  
                  1 Reply Last reply
                  0
                  • J.HilkJ Offline
                    J.HilkJ Offline
                    J.Hilk
                    Moderators
                    wrote on last edited by J.Hilk
                    #15

                    @Quentin91

                    couple of things, that cause this error.

                    First of, MiniModel is not a Signelton nor a context property but a registered type.

                    So you'll have to instantiate the type in your QML code

                    ApplicationWindow {
                        id: root
                        width: 300
                        height: 480
                        visible:true
                        Text{
                           id: testText
                           x: 62
                           y: 75
                           color: "#d21616"
                           text:  "vanilla"
                           visible: false
                        }
                    
                        MiniModel{
                            id:mModel
                        }
                    
                        MouseArea{
                            anchors.fill: parent
                            onClicked: testText.visible=  mModel.miniboule 
                        }
                    }
                    

                    Secondly, getMiniboule() is the getter function for the miniboule property. You're not supposed to call that manually, but rather let the property system handle that:

                    Q_PROPERTY(bool miniboule READ getMiniboule WRITE setMiniboule NOTIFY minibouleChanged)
                    
                    miniboule -> property name in QML 
                    getMiniboule -> c++ getter function name
                    setMiniboule -> c++ setter function name 
                    
                    -----
                    //in QML set value
                    mModel.miniboule = true
                    
                    //read the value
                    var a = mModel.miniboule
                    

                    Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                    Q: What's that?
                    A: It's blue light.
                    Q: What does it do?
                    A: It turns blue.

                    Q 1 Reply Last reply
                    2
                    • J.HilkJ J.Hilk

                      @Quentin91

                      couple of things, that cause this error.

                      First of, MiniModel is not a Signelton nor a context property but a registered type.

                      So you'll have to instantiate the type in your QML code

                      ApplicationWindow {
                          id: root
                          width: 300
                          height: 480
                          visible:true
                          Text{
                             id: testText
                             x: 62
                             y: 75
                             color: "#d21616"
                             text:  "vanilla"
                             visible: false
                          }
                      
                          MiniModel{
                              id:mModel
                          }
                      
                          MouseArea{
                              anchors.fill: parent
                              onClicked: testText.visible=  mModel.miniboule 
                          }
                      }
                      

                      Secondly, getMiniboule() is the getter function for the miniboule property. You're not supposed to call that manually, but rather let the property system handle that:

                      Q_PROPERTY(bool miniboule READ getMiniboule WRITE setMiniboule NOTIFY minibouleChanged)
                      
                      miniboule -> property name in QML 
                      getMiniboule -> c++ getter function name
                      setMiniboule -> c++ setter function name 
                      
                      -----
                      //in QML set value
                      mModel.miniboule = true
                      
                      //read the value
                      var a = mModel.miniboule
                      
                      Q Offline
                      Q Offline
                      Quentin91
                      wrote on last edited by Quentin91
                      #16

                      @J.Hilk ok, I see, thank you very much ! so I have to use another way to communicate...
                      i don't want to instanciate my type in the QML. My job is to transform a QML python application into C ++ QML. And the QML I will use does not instanciate the types.
                      This is an extract of the python code

                      module = importlib.import_module('models.'+self.model_file)
                                 self.main_model = module.MainModel( self )
                                 self.rootContext().setContextProperty( 'mainModel', self.main_model )
                                 self.statusChanged.connect( self.main_model.onStatusViewChanged )
                      

                      So I thought I had to use setContextProperty in C++ too. Should I use a singleton instead ? If so, I tried. There it is :

                      I followed the example of the doc here https://doc.qt.io/qt-5/qtqml-cppintegration-definetypes.html

                      miniModel.h (the singleton)

                      #ifndef _MINIMODEL_H_
                      #define _MINIMODEL_H_
                      #include <stdlib.h>
                      #include <stdio.h>
                      #include <iostream>
                      #include <string>
                      #include <QtGui/qguiapplication.h> 
                      #include <QtQml/qqmlcontext.h>
                      #include <QtQml/qqmlapplicationengine.h>
                      #include <QtCore/qdebug.h>
                      #include <QtCore/qobject.h>
                      #include <QtCore/qvariant.h>
                      
                      class MiniModel : public QObject
                      {
                      	Q_OBJECT
                      	Q_PROPERTY(bool miniboule READ miniboule WRITE setMiniboule NOTIFY minibouleChanged)
                      public:
                      	MiniModel();
                      	bool miniboule();
                      	void setMiniboule(bool bouboule);
                      signals:
                      	void minibouleChanged();
                      private:
                      	bool m_miniboule;
                      };
                      
                      #endif
                      

                      miniModel.cpp

                      #include "miniModel.h"
                      
                      MiniModel::MiniModel():m_miniboule(true)
                      {
                      }
                      bool MiniModel::miniboule() {
                      	return m_miniboule;
                      }
                      void MiniModel::setMiniboule(bool bouboule){
                      	m_miniboule = bouboule;
                      	emit minibouleChanged();
                      }
                      

                      main.cpp v1 : singleton using a QObject

                      #include "miniModel.h"
                      
                      //defining a miniModel instance as a singleton
                      static QObject* mp_singleton(QQmlEngine* engine, QJSEngine* scriptEngine)
                      {
                      	Q_UNUSED(engine)
                      	Q_UNUSED(scriptEngine)
                      
                      	MiniModel* miniSingleton = new MiniModel();
                      	return miniSingleton;
                      }
                      
                      int main(int argc=0, char* argv[]=nullptr)
                      {
                      	printf("\n launching \n");
                      	QGuiApplication app(argc, argv);
                      
                      	qmlRegisterSingletonType<MiniModel>("myModel.miniModel", 1, 0, "MiniModel",mp_singleton);
                      
                      	QQmlApplicationEngine engine;
                      
                      	engine.addImportPath(QStringLiteral("..\\..\\..\\..\\Tools\\Qt\\5.12.0\\x64\\5.12.0\\msvc2017_64\\qml"));
                      	engine.load(QUrl(QStringLiteral("..\\..\\..\\miniModel.qml")));
                      
                      	return app.exec();
                      }
                      

                      main.cpp v2 : singletin using QJSValue

                      #include "miniModel.h"
                      
                      static QJSValue m_singletonModel(QQmlEngine* engine, QJSEngine* scriptEngine) {
                      	Q_UNUSED(engine)
                      
                      	static bool m_miniboule;
                      	QJSValue miniModel = scriptEngine->newObject();
                      	miniModel.setProperty("miniboule", m_miniboule);
                      	return miniModel;
                      }
                      
                      int main(int argc = 0, char* argv[] = nullptr)
                      {
                      	printf("\n launching \n");
                      	QGuiApplication app(argc, argv);
                      
                      	qmlRegisterSingletonType("myModel.miniModel", 1, 0, "MiniModel", m_singletonModel);
                      
                      	QQmlApplicationEngine engine;
                      
                      	engine.addImportPath(QStringLiteral("..\\..\\..\\..\\Tools\\Qt\\5.12.0\\x64\\5.12.0\\msvc2017_64\\qml"));
                      	engine.load(QUrl(QStringLiteral("..\\..\\..\\miniModel.qml")));
                      
                      	return app.exec();
                      }
                      
                      

                      and the QML. be careful, it's tough

                      import QtQuick 2.5
                      import QtQuick.Window 2.5
                      import QtQuick.Controls 1.4
                      
                      import myModel.miniModel 1.0 as MyModel
                      ApplicationWindow {
                          id: root
                          width: 300
                          height: 480
                          visible:true
                          Text{
                             id: textTest
                             x: 62
                             y: 75
                             color: "#d21616"
                             text:  "vanilla"
                             visible: false//the text is supposed to appear when clicking in the mouseArea
                          }
                          MouseArea{
                              anchors.fill: parent
                              onClicked: textTest.visible=  MyModel.Minimodel.miniboule//the boolean I want to acess, defined to true
                          }
                      }
                      

                      now, the error changed, since I called MyModel.MiniModel.miniboule instead of just MiniModel.miniboule
                      the error is TypeError: Cannot read property 'miniboule' of undefined

                      ps : the topic is now the same than this one. I made another topic for another error, but the errors are actually linked (or the same) : https://forum.qt.io/topic/102730/error-cannot-assign-undefined-to-qstring-while-communicating-between-c-and-qml

                      1 Reply Last reply
                      0
                      • fcarneyF Offline
                        fcarneyF Offline
                        fcarney
                        wrote on last edited by
                        #17

                        @Quentin91 said in qmlRegisterType => QML module not found. How to specify the path to the object ?:

                        import myModel.miniModel 1.0 as MyModel

                        The way you have written this MyModel is the MiniModel.
                        So you should be accessing miniboule like this:

                        onClicked: textTest.visible=  MyModel.miniboule
                        

                        C++ is a perfectly valid school of magic.

                        Q 1 Reply Last reply
                        0
                        • fcarneyF fcarney

                          @Quentin91 said in qmlRegisterType => QML module not found. How to specify the path to the object ?:

                          import myModel.miniModel 1.0 as MyModel

                          The way you have written this MyModel is the MiniModel.
                          So you should be accessing miniboule like this:

                          onClicked: textTest.visible=  MyModel.miniboule
                          
                          Q Offline
                          Q Offline
                          Quentin91
                          wrote on last edited by
                          #18

                          @fcarney

                          onClicked: textTest.visible= MyModel.miniboule

                          When I write it this way, the error is cannot assign [undefined] to bool
                          Else, when writing MyModel.MiniModel.miniboule, it says ContentItem: Binding loop detected for property "implicitWidth but it works !

                          It's been three days that I'm working on that version, singleton, all day and I have no idea why it works only now... but anyway, thank you very much for your help !

                          J.HilkJ 1 Reply Last reply
                          0
                          • Q Quentin91

                            @fcarney

                            onClicked: textTest.visible= MyModel.miniboule

                            When I write it this way, the error is cannot assign [undefined] to bool
                            Else, when writing MyModel.MiniModel.miniboule, it says ContentItem: Binding loop detected for property "implicitWidth but it works !

                            It's been three days that I'm working on that version, singleton, all day and I have no idea why it works only now... but anyway, thank you very much for your help !

                            J.HilkJ Offline
                            J.HilkJ Offline
                            J.Hilk
                            Moderators
                            wrote on last edited by
                            #19

                            @Quentin91

                            //main.cpp
                            #include <QApplication>
                            #include <QQmlApplicationEngine>
                            
                            #include "minimodel.h"
                            
                            int main(int argc, char *argv[])
                            {
                                QApplication app(argc, argv);
                            
                                QQmlApplicationEngine engine;
                                MiniModel mModel;
                                engine.rootContext()->setContextProperty("MiniModel", &mModel);
                            
                                engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
                                if (engine.rootObjects().isEmpty())
                                    return -1;
                            
                                return app.exec();
                            }
                            
                            
                            //main.qml
                            import QtQuick 2.5
                            import QtQuick.Window 2.5
                            import QtQuick.Controls 1.4
                            
                            ApplicationWindow {
                                id: root
                                width: 300
                                height: 480
                                visible:true
                                Text{
                                   id: testText
                                   x: 62
                                   y: 75
                                   color: "#d21616"
                                   text:  "vanilla"
                                   visible: false
                                }
                            
                            
                                MouseArea{
                                    anchors.fill: parent
                                    onClicked: testText.visible=  MiniModel.miniboule
                                }
                            }
                            

                            works fine


                            Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                            Q: What's that?
                            A: It's blue light.
                            Q: What does it do?
                            A: It turns blue.

                            1 Reply Last reply
                            2

                            • Login

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