Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. How to create QML singleton
Qt 6.12 LTS 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 6.0k 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
    #3

    I have deleted build folder and now there is

    singleton EPGColors 1.0 qml/EPGColors.qml
    

    in qmldir file.

    I have added import to EPGItem.qml:

    import QtQuick
    import Qt5Compat.GraphicalEffects   // required for Qt < 6.5
    // import QtQuick.Effects              // not available in Qt < 6.5
    import ProgrammeGuide
    
    Item {
        id: progItem
        // ...
        property color pastProgColor: EPGColors.pastProgColor
        // ...
    }
    

    And now I get this message that is even more confusing:

    qrc:/qml/EPGItem.qml:42: TypeError: EPGColors was a singleton at compile time, but is not a singleton anymore.
    
    1 Reply Last reply
    0
    • 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 Offline
        GrecKoG Offline
        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 Offline
              ekkescornerE Offline
              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 Offline
                  ekkescornerE Offline
                  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
                                • Unsolved