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. How to create QML singleton
Qt 6.11 is out! See what's new in the release blog

How to create QML singleton

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
17 Posts 5 Posters 5.8k Views 2 Watching
  • 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.
  • K Offline
    K Offline
    KejPi
    wrote on last edited by
    #4

    I do not know how to attach file, so this is cope and paste of minimal example:

    CMakeList.txt

    cmake_minimum_required(VERSION 3.16)
    
    project(SingletonTest VERSION 0.1 LANGUAGES CXX)
    
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
    find_package(Qt6 6.4 REQUIRED COMPONENTS Quick)
    
    qt_standard_project_setup()
    
    qt_add_executable(appSingletonTest
        main.cpp
    )
    
    set_source_files_properties(qml/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
    qt_add_qml_module(appSingletonTest
        URI SingletonTest
        VERSION 1.0
        QML_FILES qml/main.qml
        QML_FILES qml/Colors.qml
    )
    
    # Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
    # If you are developing for iOS or macOS you should consider setting an
    # explicit, fixed bundle identifier manually though.
    set_target_properties(appSingletonTest PROPERTIES
    #    MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appSingletonTest
        MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
        MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
        MACOSX_BUNDLE TRUE
        WIN32_EXECUTABLE TRUE
    )
    
    target_link_libraries(appSingletonTest
        PRIVATE Qt6::Quick
    )
    
    include(GNUInstallDirs)
    install(TARGETS appSingletonTest
        BUNDLE DESTINATION .
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    )
    
    

    main.cpp:

    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    
    int main(int argc, char *argv[])
    {
        QGuiApplication app(argc, argv);
    
        QQmlApplicationEngine engine;
        const QUrl url(u"qrc:/SingletonTest/qml/main.qml"_qs);
        QObject::connect(
            &engine,
            &QQmlApplicationEngine::objectCreationFailed,
            &app,
            []() { QCoreApplication::exit(-1); },
            Qt::QueuedConnection);
        engine.load(url);
    
        return app.exec();
    }
    

    qml/main.qml:

    import QtQuick
    import SingletonTest
    
    Window {
        width: 640
        height: 480
        visible: true
        title: qsTr("Hello World")
    
        Rectangle {
            width: parent.width/2
            height: parent.height/2
            anchors.centerIn: parent
            color: Colors.myColor
        }
    }
    

    qml/Colors.qml:

    pragma Singleton
    import QtQuick
    
    QtObject {
        id: colors
        readonly property color myColor: "red"
    }
    

    When I run it I get this message:

    qrc:/SingletonTest/qml/main.qml:14: TypeError: Colors was a singleton at compile time, but is not a singleton anymore.
    
    GrecKoG MesrineM 2 Replies Last reply
    1
    • K KejPi

      I do not know how to attach file, so this is cope and paste of minimal example:

      CMakeList.txt

      cmake_minimum_required(VERSION 3.16)
      
      project(SingletonTest VERSION 0.1 LANGUAGES CXX)
      
      set(CMAKE_CXX_STANDARD_REQUIRED ON)
      
      find_package(Qt6 6.4 REQUIRED COMPONENTS Quick)
      
      qt_standard_project_setup()
      
      qt_add_executable(appSingletonTest
          main.cpp
      )
      
      set_source_files_properties(qml/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
      qt_add_qml_module(appSingletonTest
          URI SingletonTest
          VERSION 1.0
          QML_FILES qml/main.qml
          QML_FILES qml/Colors.qml
      )
      
      # Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
      # If you are developing for iOS or macOS you should consider setting an
      # explicit, fixed bundle identifier manually though.
      set_target_properties(appSingletonTest PROPERTIES
      #    MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appSingletonTest
          MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
          MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
          MACOSX_BUNDLE TRUE
          WIN32_EXECUTABLE TRUE
      )
      
      target_link_libraries(appSingletonTest
          PRIVATE Qt6::Quick
      )
      
      include(GNUInstallDirs)
      install(TARGETS appSingletonTest
          BUNDLE DESTINATION .
          LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
          RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
      )
      
      

      main.cpp:

      #include <QGuiApplication>
      #include <QQmlApplicationEngine>
      
      int main(int argc, char *argv[])
      {
          QGuiApplication app(argc, argv);
      
          QQmlApplicationEngine engine;
          const QUrl url(u"qrc:/SingletonTest/qml/main.qml"_qs);
          QObject::connect(
              &engine,
              &QQmlApplicationEngine::objectCreationFailed,
              &app,
              []() { QCoreApplication::exit(-1); },
              Qt::QueuedConnection);
          engine.load(url);
      
          return app.exec();
      }
      

      qml/main.qml:

      import QtQuick
      import SingletonTest
      
      Window {
          width: 640
          height: 480
          visible: true
          title: qsTr("Hello World")
      
          Rectangle {
              width: parent.width/2
              height: parent.height/2
              anchors.centerIn: parent
              color: Colors.myColor
          }
      }
      

      qml/Colors.qml:

      pragma Singleton
      import QtQuick
      
      QtObject {
          id: colors
          readonly property color myColor: "red"
      }
      

      When I run it I get this message:

      qrc:/SingletonTest/qml/main.qml:14: TypeError: Colors was a singleton at compile time, but is not a singleton anymore.
      
      GrecKoG Online
      GrecKoG Online
      GrecKo
      Qt Champions 2018
      wrote on last edited by
      #5

      What if you put the QML files in the root folder of the project? Colors.qml instead of qml/Colors.qml

      Also I'd remove the second QML_FILES in qt_add_qml_module

      K 1 Reply Last reply
      0
      • GrecKoG GrecKo

        What if you put the QML files in the root folder of the project? Colors.qml instead of qml/Colors.qml

        Also I'd remove the second QML_FILES in qt_add_qml_module

        K Offline
        K Offline
        KejPi
        wrote on last edited by
        #6

        If I move Colors.qml to root folder and change CMakeList.txt accordingly:

        set_source_files_properties(Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
        qt_add_qml_module(appSingletonTest
            URI SingletonTest
            VERSION 1.0
            QML_FILES qml/main.qml
                      Colors.qml
        )
        

        I get this error when I run the application:

        qrc:/SingletonTest/qml/main.qml:14: ReferenceError: Colors is not defined
        
        K 1 Reply Last reply
        0
        • K KejPi

          If I move Colors.qml to root folder and change CMakeList.txt accordingly:

          set_source_files_properties(Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
          qt_add_qml_module(appSingletonTest
              URI SingletonTest
              VERSION 1.0
              QML_FILES qml/main.qml
                        Colors.qml
          )
          

          I get this error when I run the application:

          qrc:/SingletonTest/qml/main.qml:14: ReferenceError: Colors is not defined
          
          K Offline
          K Offline
          KejPi
          wrote on last edited by KejPi
          #7

          It seems all QML files must be in root folder including some other custom components files.

          If I do this, it works:

          set_source_files_properties(Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
          qt_add_qml_module(appSingletonTest
              URI SingletonTest
              VERSION 1.0
              QML_FILES main.qml
                        Colors.qml
                        SomeComponent.qml
          )
          

          This strange, so far I put all my QML files to dedicated folder (qml/) to separate it from C++ and everything was working (see my first example code) - only the singleton causes some problem.

          I could consider this as workaround but I do not like it since I will mix QML with C++ and it will be a mess :-(

          EDIT: It seems that this construction works too:

          set_source_files_properties(qmlfiles/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
          set_source_files_properties(qmlfiles/main.qml PROPERTIES QT_RESOURCE_ALIAS main.qml)
          set_source_files_properties(qmlfiles/Colors.qml PROPERTIES QT_RESOURCE_ALIAS Colors.qml)
          set_source_files_properties(qmlfiles/SomeComponent.qml PROPERTIES QT_RESOURCE_ALIAS SomeComponent.qml)
          qt_add_qml_module(appSingletonTest
              URI SingletonTest
              VERSION 1.0
              QML_FILES qmlfiles/main.qml
                        qmlfiles/Colors.qml
                        qmlfiles/SomeComponent.qml
          )
          
          ekkescornerE J 2 Replies Last reply
          0
          • K KejPi

            It seems all QML files must be in root folder including some other custom components files.

            If I do this, it works:

            set_source_files_properties(Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
            qt_add_qml_module(appSingletonTest
                URI SingletonTest
                VERSION 1.0
                QML_FILES main.qml
                          Colors.qml
                          SomeComponent.qml
            )
            

            This strange, so far I put all my QML files to dedicated folder (qml/) to separate it from C++ and everything was working (see my first example code) - only the singleton causes some problem.

            I could consider this as workaround but I do not like it since I will mix QML with C++ and it will be a mess :-(

            EDIT: It seems that this construction works too:

            set_source_files_properties(qmlfiles/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
            set_source_files_properties(qmlfiles/main.qml PROPERTIES QT_RESOURCE_ALIAS main.qml)
            set_source_files_properties(qmlfiles/Colors.qml PROPERTIES QT_RESOURCE_ALIAS Colors.qml)
            set_source_files_properties(qmlfiles/SomeComponent.qml PROPERTIES QT_RESOURCE_ALIAS SomeComponent.qml)
            qt_add_qml_module(appSingletonTest
                URI SingletonTest
                VERSION 1.0
                QML_FILES qmlfiles/main.qml
                          qmlfiles/Colors.qml
                          qmlfiles/SomeComponent.qml
            )
            
            ekkescornerE Online
            ekkescornerE Online
            ekkescorner
            Qt Champions 2016
            wrote on last edited by
            #8

            @KejPi open a bugreport because QML SINGLETON doesn't work if not in root folder

            ekke ... Qt Champion 2016 | 2024 ... mobile business apps

            MesrineM 1 Reply Last reply
            0
            • ekkescornerE ekkescorner

              @KejPi open a bugreport because QML SINGLETON doesn't work if not in root folder

              MesrineM Offline
              MesrineM Offline
              Mesrine
              wrote on last edited by
              #9

              @ekkescorner

              I do not know why the one from the post does not work, but singletons from subdirectories work.

              I used here

              ekkescornerE K 2 Replies Last reply
              0
              • MesrineM Mesrine

                @ekkescorner

                I do not know why the one from the post does not work, but singletons from subdirectories work.

                I used here

                ekkescornerE Online
                ekkescornerE Online
                ekkescorner
                Qt Champions 2016
                wrote on last edited by
                #10

                @Mesrine aaah - good to know. just porting my apps from QMake to CMake. next step will be to modernize my apps, where I'll need QML SINGLETONS, too

                ekke ... Qt Champion 2016 | 2024 ... mobile business apps

                1 Reply Last reply
                0
                • K KejPi

                  It seems all QML files must be in root folder including some other custom components files.

                  If I do this, it works:

                  set_source_files_properties(Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
                  qt_add_qml_module(appSingletonTest
                      URI SingletonTest
                      VERSION 1.0
                      QML_FILES main.qml
                                Colors.qml
                                SomeComponent.qml
                  )
                  

                  This strange, so far I put all my QML files to dedicated folder (qml/) to separate it from C++ and everything was working (see my first example code) - only the singleton causes some problem.

                  I could consider this as workaround but I do not like it since I will mix QML with C++ and it will be a mess :-(

                  EDIT: It seems that this construction works too:

                  set_source_files_properties(qmlfiles/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
                  set_source_files_properties(qmlfiles/main.qml PROPERTIES QT_RESOURCE_ALIAS main.qml)
                  set_source_files_properties(qmlfiles/Colors.qml PROPERTIES QT_RESOURCE_ALIAS Colors.qml)
                  set_source_files_properties(qmlfiles/SomeComponent.qml PROPERTIES QT_RESOURCE_ALIAS SomeComponent.qml)
                  qt_add_qml_module(appSingletonTest
                      URI SingletonTest
                      VERSION 1.0
                      QML_FILES qmlfiles/main.qml
                                qmlfiles/Colors.qml
                                qmlfiles/SomeComponent.qml
                  )
                  
                  J Offline
                  J Offline
                  Janson
                  wrote on last edited by Janson
                  #11
                  This post is deleted!
                  1 Reply Last reply
                  0
                  • K Offline
                    K Offline
                    KejPi
                    wrote on last edited by
                    #12

                    I have a small example project that clearly shows it does not work as expected. I can share it but I do not know how to do it here. Maybe I did something wrong - I have juste created project in QtCreator and moved all QML files in subdirectory.

                    1 Reply Last reply
                    0
                    • MesrineM Mesrine

                      @ekkescorner

                      I do not know why the one from the post does not work, but singletons from subdirectories work.

                      I used here

                      K Offline
                      K Offline
                      KejPi
                      wrote on last edited by
                      #13

                      @Mesrine Could it be that you only have singleton in the module while I have all my QML files there?

                      1 Reply Last reply
                      0
                      • K KejPi

                        I do not know how to attach file, so this is cope and paste of minimal example:

                        CMakeList.txt

                        cmake_minimum_required(VERSION 3.16)
                        
                        project(SingletonTest VERSION 0.1 LANGUAGES CXX)
                        
                        set(CMAKE_CXX_STANDARD_REQUIRED ON)
                        
                        find_package(Qt6 6.4 REQUIRED COMPONENTS Quick)
                        
                        qt_standard_project_setup()
                        
                        qt_add_executable(appSingletonTest
                            main.cpp
                        )
                        
                        set_source_files_properties(qml/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
                        qt_add_qml_module(appSingletonTest
                            URI SingletonTest
                            VERSION 1.0
                            QML_FILES qml/main.qml
                            QML_FILES qml/Colors.qml
                        )
                        
                        # Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
                        # If you are developing for iOS or macOS you should consider setting an
                        # explicit, fixed bundle identifier manually though.
                        set_target_properties(appSingletonTest PROPERTIES
                        #    MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appSingletonTest
                            MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
                            MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
                            MACOSX_BUNDLE TRUE
                            WIN32_EXECUTABLE TRUE
                        )
                        
                        target_link_libraries(appSingletonTest
                            PRIVATE Qt6::Quick
                        )
                        
                        include(GNUInstallDirs)
                        install(TARGETS appSingletonTest
                            BUNDLE DESTINATION .
                            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
                            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
                        )
                        
                        

                        main.cpp:

                        #include <QGuiApplication>
                        #include <QQmlApplicationEngine>
                        
                        int main(int argc, char *argv[])
                        {
                            QGuiApplication app(argc, argv);
                        
                            QQmlApplicationEngine engine;
                            const QUrl url(u"qrc:/SingletonTest/qml/main.qml"_qs);
                            QObject::connect(
                                &engine,
                                &QQmlApplicationEngine::objectCreationFailed,
                                &app,
                                []() { QCoreApplication::exit(-1); },
                                Qt::QueuedConnection);
                            engine.load(url);
                        
                            return app.exec();
                        }
                        

                        qml/main.qml:

                        import QtQuick
                        import SingletonTest
                        
                        Window {
                            width: 640
                            height: 480
                            visible: true
                            title: qsTr("Hello World")
                        
                            Rectangle {
                                width: parent.width/2
                                height: parent.height/2
                                anchors.centerIn: parent
                                color: Colors.myColor
                            }
                        }
                        

                        qml/Colors.qml:

                        pragma Singleton
                        import QtQuick
                        
                        QtObject {
                            id: colors
                            readonly property color myColor: "red"
                        }
                        

                        When I run it I get this message:

                        qrc:/SingletonTest/qml/main.qml:14: TypeError: Colors was a singleton at compile time, but is not a singleton anymore.
                        
                        MesrineM Offline
                        MesrineM Offline
                        Mesrine
                        wrote on last edited by Mesrine
                        #14

                        @KejPi

                        I have used your minimal example and works ok :) .

                        The only thing I changed was that instead of CMakeList.txt i named CMakeLists.txt.

                        I have tested it with qt(shared libraries) 6.5,6.6,6.7 in Linux.

                        Make sure you are using the correct CMakeLists.txt.
                        And let us know your platform and Qt version.

                        1 Reply Last reply
                        0
                        • K Offline
                          K Offline
                          KejPi
                          wrote on last edited by KejPi
                          #15

                          Yes, it was only typo, I use the CMakeLists.txt created by Qt Creator.
                          I am running it on MacOS 14.2, Qt version 6.5.3

                          MesrineM 1 Reply Last reply
                          0
                          • K KejPi

                            Yes, it was only typo, I use the CMakeLists.txt created by Qt Creator.
                            I am running it on MacOS 14.2, Qt version 6.5.3

                            MesrineM Offline
                            MesrineM Offline
                            Mesrine
                            wrote on last edited by
                            #16

                            @KejPi
                            Do you run the application that is on the build directory or the installed one?

                            Try putting
                            set_source_files_properties(qml/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)

                            before

                            qt_add_executable(appSingletonTest
                                main.cpp
                            )
                            

                            in your minimal example.
                            If that does not work try removing some macos properties in the CMakeLists.txt.
                            If nothing works I would say you can open a bug as suggested by @ekkescorner

                            K 1 Reply Last reply
                            0
                            • MesrineM Mesrine

                              @KejPi
                              Do you run the application that is on the build directory or the installed one?

                              Try putting
                              set_source_files_properties(qml/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)

                              before

                              qt_add_executable(appSingletonTest
                                  main.cpp
                              )
                              

                              in your minimal example.
                              If that does not work try removing some macos properties in the CMakeLists.txt.
                              If nothing works I would say you can open a bug as suggested by @ekkescorner

                              K Offline
                              K Offline
                              KejPi
                              wrote on last edited by KejPi
                              #17

                              @Mesrine I run the application directly from Qt Creator after building it.
                              Moving set_source_files_properties did not help, the problem is the same.

                              Bug report created https://bugreports.qt.io/browse/QTBUG-121758

                              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