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 ?
Forum Updated to NodeBB v4.3 + New Features

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 6.6k 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 Quentin91

    @Mammamia thanks for your answer. I started it but it's definitely taking too long as I use visual studio without Qt. Creating a new solution, writing the batch files to set the environment, add all the dll etc... it takes hours to make everything to work.

    What I just need is : How can I specify the path there

    import QtQuick.controls 2.5
    import "../../x64/Debug"anothertry.miniModel 1.0
    import "../../Src/" 1.0//File or directory not found
    import "../../x64/Debug/TEST_VIEW4.tlog" anothertry.minimodel 1.0;//symbol waited ";"
    import anothertry.miniModel 1.0//QML module not found
    
    ApplicationWindow {
    
    qmlRegisterType<MiniModel>("miniModel", 1, 0, "MiniModel");
    

    i'm new to QML and just don't know how to deal with it. I struggle to find some information about it. It's probably too obvious...

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

    @Quentin91
    I don't use VS, but I had some troubles with imports from folders that aren't subfolders as well.

    https://forum.qt.io/topic/98165/import-with-relative-path/6

    Also, I never tried it, but are you sure QML import actually accepts \\ as valid path ? Usually its /on all platforms


    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
    1
    • J.HilkJ J.Hilk

      @Quentin91
      I don't use VS, but I had some troubles with imports from folders that aren't subfolders as well.

      https://forum.qt.io/topic/98165/import-with-relative-path/6

      Also, I never tried it, but are you sure QML import actually accepts \\ as valid path ? Usually its /on all platforms

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

      @J.Hilk Thank you very much

      You're right, the path is not correctly written. I'll update the answer.

      i looked at the link you added, but my problem is not about importing a module, but about importing a new type defined in C++.
      I tried to add a path because I'm desperate but usually, people just do that

      /*c++*/qmlRegisterType<MiniModel>("anothertry.miniModel", 1, 0, "MiniModel");
      /*qml*/import anothertry.minimodel 1.0 //but for me, QML module not found
      

      What's going on ? In what file or where is the new type specified after the project is built ?

      J.HilkJ 1 Reply Last reply
      0
      • Q Quentin91

        @J.Hilk Thank you very much

        You're right, the path is not correctly written. I'll update the answer.

        i looked at the link you added, but my problem is not about importing a module, but about importing a new type defined in C++.
        I tried to add a path because I'm desperate but usually, people just do that

        /*c++*/qmlRegisterType<MiniModel>("anothertry.miniModel", 1, 0, "MiniModel");
        /*qml*/import anothertry.minimodel 1.0 //but for me, QML module not found
        

        What's going on ? In what file or where is the new type specified after the project is built ?

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

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

        What's going on ? In what file or where is the new type specified ?

        I usually do that in main.cpp right before the instance of QQmlApplicationEngine is created.


        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
          #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