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. Custom C++ type from a QML module is not defined when used inside QML file
QtWS25 Last Chance

Custom C++ type from a QML module is not defined when used inside QML file

Scheduled Pinned Locked Moved Solved QML and Qt Quick
c++ to qmlc++qmlcustom typesingleton
16 Posts 3 Posters 2.5k 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.
  • A Offline
    A Offline
    Anumas
    wrote on last edited by
    #7

    @monkeber after doing what I said you should get your app working

    image.png

    To fix Qt Creator complaining about unknown types, you have to modify your module definition:

    project(logicmodulelib VERSION 0.1 LANGUAGES CXX)
    
    qt_add_library(${PROJECT_NAME} STATIC)
    qt_add_qml_module(${PROJECT_NAME}
        URI logicmodule
        VERSION 1.0
        RESOURCE_PREFIX "/qt/qml"
        QML_FILES
            Main.qml
        SOURCES
            MySingleton.h
            Message.h
    )
    ...
    

    In the URI you MUST follow your project structure. https://doc.qt.io/qt-6/qtqml-writing-a-module.html

    Update your root's CMakeLists.txt to link to the plugin correctly: target_link_libraries(apptypetest PUBLIC logicmodulelibplugin)

    Say hello to a bright day.-

    Anumas.

    1 Reply Last reply
    2
    • dheerendraD Offline
      dheerendraD Offline
      dheerendra
      Qt Champions 2022
      wrote on last edited by
      #8

      You can see the example in my repository.
      https://github.com/QtDheeru/QtExamples/tree/master/QML/QMLSingleTonIssue

      Dheerendra
      @Community Service
      Certified Qt Specialist
      http://www.pthinks.com

      1 Reply Last reply
      1
      • M Offline
        M Offline
        monkeber
        wrote on last edited by
        #9

        @Anumas Thank you very much, your suggestion indeed helped me and now qml properly recognizes custom types!

        A note regarding Qt Creator complaining about unknown types - for some reason implementing fixes as you suggested didn't help, but what helped is setting QML_IMPORT_PATH in root CMakeLists.txt, do you think this is a proper fix for this or is something wrong here?

        CMakeLists files now look like this:

        # logicmodule/CMakeLists.txt
        project(logicmodulelib VERSION 0.1 LANGUAGES CXX)
        
        qt_add_library(${PROJECT_NAME} STATIC)
        qt_add_qml_module(${PROJECT_NAME}
        	URI logicmodule
        	VERSION 1.0
        	RESOURCE_PREFIX "/qt/qml"
        	QML_FILES
        		Main.qml
        	SOURCES
        		MySingleton.h
        		Message.h
        )
        
        target_link_libraries(${PROJECT_NAME} PUBLIC
        	Qt6::Core
        	Qt6::Gui
        	Qt6::Qml
        	Qt6::Quick
        )
        
        target_include_directories(${PROJECT_NAME}
        	PUBLIC
        		.
        )
        
        # CmakeLists.txt
        cmake_minimum_required(VERSION 3.16)
        
        project(typetest VERSION 0.1 LANGUAGES CXX)
        
        set(CMAKE_CXX_STANDARD_REQUIRED ON)
        
        find_package(Qt6 6.5 REQUIRED COMPONENTS Quick)
        qt_policy(SET QTP0001 NEW)
        set(QT_QML_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/qt/qml)
        set(QML_IMPORT_PATH "${CMAKE_BINARY_DIR}/qt/qml" CACHE STRING "Qt Creator extra qml import paths"
        	FORCE)
        
        qt_standard_project_setup(REQUIRES 6.5)
        
        add_subdirectory(logicmodule)
        
        qt_add_executable(apptypetest
        	main.cpp
        )
        
        target_link_libraries(apptypetest PUBLIC
        	Qt6::Gui
        	Qt6::Qml
        	logicmodulelibplugin
        )
        
        A 1 Reply Last reply
        0
        • M Offline
          M Offline
          monkeber
          wrote on last edited by
          #10

          @dheerendra Sorry, I'm not sure I understood your example correctly. When I start your example I get an error:

          QQmlApplicationEngine failed to load component
          qrc:/qt/qml/dheeru/Main/Main.qml: No such file or directory
          

          Does it work for you? Maybe I'm doing something wrong.

          I also tried to tweak it to make it work for me, but with no success so far.

          1 Reply Last reply
          0
          • dheerendraD Offline
            dheerendraD Offline
            dheerendra
            Qt Champions 2022
            wrote on last edited by
            #11

            Yes. It is working example. Did you make any changes to the program ?
            I have failed case with StaticPlugin/CMakeLists.txt -
            qt_add_library(${PROJECT_NAME} STATIC). Change this line to ->qt_add_library(${PROJECT_NAME} SHARED)

            Everything should work.

            Dheerendra
            @Community Service
            Certified Qt Specialist
            http://www.pthinks.com

            1 Reply Last reply
            0
            • M monkeber

              @Anumas Thank you very much, your suggestion indeed helped me and now qml properly recognizes custom types!

              A note regarding Qt Creator complaining about unknown types - for some reason implementing fixes as you suggested didn't help, but what helped is setting QML_IMPORT_PATH in root CMakeLists.txt, do you think this is a proper fix for this or is something wrong here?

              CMakeLists files now look like this:

              # logicmodule/CMakeLists.txt
              project(logicmodulelib VERSION 0.1 LANGUAGES CXX)
              
              qt_add_library(${PROJECT_NAME} STATIC)
              qt_add_qml_module(${PROJECT_NAME}
              	URI logicmodule
              	VERSION 1.0
              	RESOURCE_PREFIX "/qt/qml"
              	QML_FILES
              		Main.qml
              	SOURCES
              		MySingleton.h
              		Message.h
              )
              
              target_link_libraries(${PROJECT_NAME} PUBLIC
              	Qt6::Core
              	Qt6::Gui
              	Qt6::Qml
              	Qt6::Quick
              )
              
              target_include_directories(${PROJECT_NAME}
              	PUBLIC
              		.
              )
              
              # CmakeLists.txt
              cmake_minimum_required(VERSION 3.16)
              
              project(typetest VERSION 0.1 LANGUAGES CXX)
              
              set(CMAKE_CXX_STANDARD_REQUIRED ON)
              
              find_package(Qt6 6.5 REQUIRED COMPONENTS Quick)
              qt_policy(SET QTP0001 NEW)
              set(QT_QML_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/qt/qml)
              set(QML_IMPORT_PATH "${CMAKE_BINARY_DIR}/qt/qml" CACHE STRING "Qt Creator extra qml import paths"
              	FORCE)
              
              qt_standard_project_setup(REQUIRES 6.5)
              
              add_subdirectory(logicmodule)
              
              qt_add_executable(apptypetest
              	main.cpp
              )
              
              target_link_libraries(apptypetest PUBLIC
              	Qt6::Gui
              	Qt6::Qml
              	logicmodulelibplugin
              )
              
              A Offline
              A Offline
              Anumas
              wrote on last edited by Anumas
              #12

              @monkeber Sorry, I forgot to add that you needed to reset your code model: Go to Tools -> QML/JS -> Reset Code Model. Always try to reset it when Qt Creator complains about unknown types.

              Say hello to a bright day.-

              Anumas.

              M 1 Reply Last reply
              0
              • A Anumas

                @monkeber Sorry, I forgot to add that you needed to reset your code model: Go to Tools -> QML/JS -> Reset Code Model. Always try to reset it when Qt Creator complains about unknown types.

                M Offline
                M Offline
                monkeber
                wrote on last edited by
                #13

                @Anumas Yes, I've tried to reset the code model, clean rebuild and also I've updated Qt Creator to 13.0.2 (from 13.0.0) just in case. Not sure what's wrong, but after commenting out setting QML_IMPORT_PATH again, rebuilding and resetting the code model - Qt Creator can't recognize the module:
                fc9081e9-e4e0-4307-8b5f-2310e4a63e6b-image.png

                QML_IMPORT_PATH is indeed not in CMakeCache.txt unless I set it from CMake.

                Maybe I indeed need to set it manually:
                https://doc.qt.io/qtcreator/creator-qml-modules-with-plugins.html#importing-qml-modules

                I'm also on Windows, not sure if it's relevant or not.

                1 Reply Last reply
                0
                • M monkeber has marked this topic as solved on
                • M Offline
                  M Offline
                  monkeber
                  wrote on last edited by
                  #14

                  @dheerendra
                  Sorry, I'm not sure what am I doing wrong here, but even after changing qt_add_library(${PROJECT_NAME} STATIC) to qt_add_library(${PROJECT_NAME} SHARED) as you suggested I still get this error while trying to run the example:

                  23:42:38: Starting E:\Projects\QtExamples-master\QML\QMLSingleTonIssue\build\Debug-Desktop_Qt_6_7_0_MSVC2019_64bit_MSVC2022\appQMLSingleTonIssue.exe...
                  QML debugging is enabled. Only use this in a safe environment.
                  QQmlApplicationEngine failed to load component
                  qrc:/qt/qml/dheeru/Main/Main.qml: No such file or directory
                  

                  What I did:

                  1. Download your repo in zip archive.
                  2. Unpack.
                  3. In Qt Creator Open File or Project -> QtExamples-master\QML\QMLSingleTonIssue\CMakeLists.txt
                  4. Build and Run in Debug configuration.

                  I did not change anything in the code, just retried it.

                  1 Reply Last reply
                  0
                  • dheerendraD Offline
                    dheerendraD Offline
                    dheerendra
                    Qt Champions 2022
                    wrote on last edited by
                    #15

                    @monkeber How did you solve the problem ? It helps if you post the same here.

                    Dheerendra
                    @Community Service
                    Certified Qt Specialist
                    http://www.pthinks.com

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      monkeber
                      wrote on last edited by monkeber
                      #16

                      Hi @dheerendra

                      I think the issue was in NO_PLUGIN as were suggested by @Anumas here:
                      https://forum.qt.io/post/802964

                      Seems to be working fine with static library now. I marked that message as a solution.

                      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