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

How to create QML singleton

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
17 Posts 5 Posters 3.2k 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 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
    5.15 --> 6.9 https://t1p.de/ekkeChecklist
    QMake --> CMake https://t1p.de/ekkeCMakeMobileApps

    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
        5.15 --> 6.9 https://t1p.de/ekkeChecklist
        QMake --> CMake https://t1p.de/ekkeCMakeMobileApps

        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