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. Singleton and QML in QT 6.3
Qt 6.11 is out! See what's new in the release blog

Singleton and QML in QT 6.3

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
13 Posts 8 Posters 4.8k Views 3 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.
  • R RangerQT

    I am at my wits end with this. I've searched, found "solutions" but nothing works.
    I am running Qt 6.3.2 and Qt Creator 8

    The application builds with no errors, starts but the window does not display. If I hardcode the color it runs.

    In a course I took they simply setup the qml.dir file and then imported the styles directory into the myqml module but the course was for Qt 5.

    Any help is appreciated .

    Thank you.

    I have added this to the CMakeLists.txt file with no luck.

    # Set QML singleton
    set_source_files_properties(Style.qml PROPERTIES QT_SINGLETON_TYPE TRUE)
    
    

    I have set qmldir as below and then imported using the import statement shown below.
    I have the following

    singleton Style 1.0 Style.qml
    
    

    main.qml
    style (directory)
    Style.qml
    qmldir
    ui (directory)
    myqml.qml

    Style.qml is as singleton:

    pragma Singleton
    import QtQuick
    
    QtObject {
        id: root
    
        // Global Items
        property string theme: "AML"
    
        // Main menu items
        property int menuWidth: (rootWindow.width / 4)
        property int menuHeight: (rootWindow.height)
        property string menubgColor: "orange"
        property string menuItemColor: "pink"
    
    }
     in my myqml.qml I have the following.  If I set the rectangle color to a string such as "orange" everything works fine but if I try and use Style.menubgColor for the color the app builds, starts (the exe is in the task manager list) but never displays anything.
    

    import QtQuick
    import "../styles"

    Item {
    id: root

    property string currentItemName: mainMenuList.currentItemName
    
    signal menuItemClicked(var name)
    
    
    Rectangle {
        id: mainmenuColorFill
        width: parent.width
        height: rootWindow.height
        color: Style.menubgColor // "orange"
        MainMenuList {
            id:mainMenuList
            anchors.centerIn: parent
        }
    } // End Rectangle mainMenuColorFill
    

    } // End Item root

    JKSHJ Offline
    JKSHJ Offline
    JKSH
    Moderators
    wrote on last edited by
    #2

    @RangerQT said in Singleton and QML in QT 6.3:

    I have set qmldir as below

    Since you are using Qt 6.3, don't create qmldir files manually. Use qt_add_qml_module() instead. See https://www.qt.io/blog/introduction-to-the-qml-cmake-api

    import "../styles"
    

    This syntax is for importing a folder from disk. But you don't have a QML folder deployed with your application -- the Qt 6 CMake API is designed to build your QML code into a library (which is statically linked to your application, ideally)

    Set a URI in qt_add_qml_module() and import that URI instead.

    Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

    1 Reply Last reply
    0
    • R Offline
      R Offline
      RangerQT
      wrote on last edited by RangerQT
      #3

      Hmm. I'm trying to get my head around this <G>. The last time I used Qt was Qt 5 with pro files. I will read that article - again for the nth time!

      You mention static linking so I assume Qt 6 CMake does that for me and I don't have to tell it to do a static library.
      Thank you.

      1). Do I understand we do not need import statements anymore in QML since the qt_add_qml_module should pull them all in so I can access properties, etc without the import statement in my qml files. When would I have a QML folder deployed. I guess I thought that is what the ui and styles were - folders to import but from what you say the CMakeLists.txt should handle that.
      So I do import FlightLog which is my URI (no quotes around FlightLog) and that should work. Yes, that works so I just do FlightLog which is my URI instead of the import "somedir".

      2). Do I need a CMakeLists.txt in each subdirectory or is the one CMakeLists.txt at the project level okay. I assume not but I see examples with CMakeLIsts.txt in subdirectories but then they have cpp and h files in them.

      3). I have this in CMakeLists.txt so should this be okay to include all my *.qml files? I am assuming it's okay to do something like ui/AppWindow.qml and styles/Style.qml in the QML_FILES list.

      qt_add_executable(FlightLogbook
          main.cpp
      )
      
      
      # QML and other files
      qt_add_qml_module(FlightLogbook
          URI FlightLog
          VERSION 1.0
          QML_FILES
              main.qml
              ui/AppWindow.qml
              ui/MainMenu.qml
              ui/MainMenuList.qml
              styles/Style.qml
          SOURCES
              import/import.h
              import/import.cpp
      )
      

      4). Do I need the set_source_files_properties(Style.qml PROPERTIES QT_SINGLETON_TYPE TRUE) in my CMakeLists.txt?

      5.) I can do color: "orange" in the Rectangle but if I try color: Style.menubgColor the app builds, starts, but no window comes up. Style is recognized and when I hit the . it gives me the properties in the file so for some reason it must not like how I am using it to color the rectangle. This is with and without the pragma statement.

      1 Reply Last reply
      0
      • R Offline
        R Offline
        RangerQT
        wrote on last edited by RangerQT
        #4

        A followup to this. First I like the cmake process a lot and how things are handled in Qt6 vs Qt5 so far.

        I still can not get a property defined in one qml file used in another. I get a unable to assign [undefined] to QColor. However, if I define the property in this file.

        // Qt Imports
        import QtQuick
        
        // Our Imports
        import FlightLog
        
        Item {
            id: root
        
            property string currentItemName: mainMenuList.currentItemName
        
            signal menuItemClicked(var name)
        
            Rectangle {
                id: mainmenuColorFill
                width: parent.width
                height: rootWindow.height
                color: CustomStyles.menubgColor //  "orange"
                MainMenuList {
                    id:mainMenuList
                    anchors.centerIn: parent
                }
        
            } // End Rectangle mainMenuColorFill
        
        } // End Item root
        

        The CustomStyles.qml file is

        // Qt Imports
        import QtQuick
        
        // Our Imports
        //import FlightLog
        
        QtObject {
            id: customStyles
            property string menubgColor: "purple"
        }
        

        However, if I define a property string testcolor: "purple" in main.qml I can use mainqlmwindowid.testcolor and it works.

        I did try customStyles.menubgcolor in the MainMenu.qml file and it fails also.

        Given it works with the definition in main.qml I assume it means the build did not include the CustomStyles.qml.

        B 1 Reply Last reply
        0
        • T Offline
          T Offline
          thomaso
          wrote on last edited by
          #5

          Hi @RangerQT , did you find a solution to your question? I am fighting with something similar (but using qmake, not cmake yet)

          R 1 Reply Last reply
          0
          • T thomaso

            Hi @RangerQT , did you find a solution to your question? I am fighting with something similar (but using qmake, not cmake yet)

            R Offline
            R Offline
            RangerQT
            wrote on last edited by
            #6

            @thomaso said in Singleton and QML in QT 6.3:

            Hi @RangerQT , did you find a solution to your question? I am fighting with something similar (but using qmake, not cmake yet)

            I never did and stopped pursuing that. Right now I'm working on getting other parts of my application working and then I'll revisit Singletons since I do need them.

            1 Reply Last reply
            0
            • R RangerQT

              A followup to this. First I like the cmake process a lot and how things are handled in Qt6 vs Qt5 so far.

              I still can not get a property defined in one qml file used in another. I get a unable to assign [undefined] to QColor. However, if I define the property in this file.

              // Qt Imports
              import QtQuick
              
              // Our Imports
              import FlightLog
              
              Item {
                  id: root
              
                  property string currentItemName: mainMenuList.currentItemName
              
                  signal menuItemClicked(var name)
              
                  Rectangle {
                      id: mainmenuColorFill
                      width: parent.width
                      height: rootWindow.height
                      color: CustomStyles.menubgColor //  "orange"
                      MainMenuList {
                          id:mainMenuList
                          anchors.centerIn: parent
                      }
              
                  } // End Rectangle mainMenuColorFill
              
              } // End Item root
              

              The CustomStyles.qml file is

              // Qt Imports
              import QtQuick
              
              // Our Imports
              //import FlightLog
              
              QtObject {
                  id: customStyles
                  property string menubgColor: "purple"
              }
              

              However, if I define a property string testcolor: "purple" in main.qml I can use mainqlmwindowid.testcolor and it works.

              I did try customStyles.menubgcolor in the MainMenu.qml file and it fails also.

              Given it works with the definition in main.qml I assume it means the build did not include the CustomStyles.qml.

              B Offline
              B Offline
              blues-breaker
              wrote on last edited by
              #7

              Is set_source_files_properties(styles/Style.qml PROPERTIES QT_SINGLETON_TYPE TRUE) before the qt_add_qml_module line in your CMakeLists.txt?

              Also in your set_source_files_properties call you posted above you seem to be omitting the styles/ prefix from the file name which may also be the issue .

              I suspect the generated qmldir is not marking your Style.qml file as a singleton which can be easily checked by inspecting the generated file. I also encountered this issue and for me it was caused by incorrect ordering in the CMakeLists.txt file like I mentioned above.

              R 1 Reply Last reply
              0
              • B blues-breaker

                Is set_source_files_properties(styles/Style.qml PROPERTIES QT_SINGLETON_TYPE TRUE) before the qt_add_qml_module line in your CMakeLists.txt?

                Also in your set_source_files_properties call you posted above you seem to be omitting the styles/ prefix from the file name which may also be the issue .

                I suspect the generated qmldir is not marking your Style.qml file as a singleton which can be easily checked by inspecting the generated file. I also encountered this issue and for me it was caused by incorrect ordering in the CMakeLists.txt file like I mentioned above.

                R Offline
                R Offline
                RangerQT
                wrote on last edited by
                #8

                @blues-breaker
                Thanks for that. I'll give it a try.

                1 Reply Last reply
                0
                • I Offline
                  I Offline
                  IAlexI
                  wrote on last edited by IAlexI
                  #9

                  I've been looking for a solution for a long time, but finally figured it out: you have a typo in your source file property name, it is QT_QML_SINGLETON_TYPE, not QT_SINGLETON_TYPE . If you add

                  set_source_files_properties(Style.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
                  

                  Before qt_add_qml_modules, the singleton works without any manual qmldir or c++ code

                  R 1 Reply Last reply
                  1
                  • I IAlexI

                    I've been looking for a solution for a long time, but finally figured it out: you have a typo in your source file property name, it is QT_QML_SINGLETON_TYPE, not QT_SINGLETON_TYPE . If you add

                    set_source_files_properties(Style.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
                    

                    Before qt_add_qml_modules, the singleton works without any manual qmldir or c++ code

                    R Offline
                    R Offline
                    RangerQT
                    wrote on last edited by
                    #10

                    @IAlexI
                    Arrgh. So simple! And where to put it is another part of the puzzle. Thank you all.

                    D 1 Reply Last reply
                    0
                    • R RangerQT

                      @IAlexI
                      Arrgh. So simple! And where to put it is another part of the puzzle. Thank you all.

                      D Offline
                      D Offline
                      DrSnowLabs
                      wrote on last edited by
                      #11

                      Hi all.

                      Just to help out anyone else who get into singleton issues, I also found out that having singletons in a sub-directory doesn't work using set_source_files_properties.

                      Please take a look at this thread.

                      K ekkescornerE 2 Replies Last reply
                      1
                      • D DrSnowLabs

                        Hi all.

                        Just to help out anyone else who get into singleton issues, I also found out that having singletons in a sub-directory doesn't work using set_source_files_properties.

                        Please take a look at this thread.

                        K Offline
                        K Offline
                        kaushikv
                        wrote on last edited by
                        #12

                        @DrSnowLabs @IAlexI
                        I am also running into this issue.

                        I have several custom component in a separate directly which is like a common library for example myTextBox.qml , myTextFiled.qml

                        and i have a Style.qml file at the same location.

                        I have added Style.qml in CMAKE:

                        This sets up the singleton module Style to be used across the application

                        set_source_files_properties(Style.qml PROPERTIES
                        QT_QML_SINGLETON_TYPE TRUE
                        )

                        but still I can' access Style.properties inside the same directory or from another library which uses these common custom components.

                        any ideas to resolve this issue?

                        1 Reply Last reply
                        0
                        • D DrSnowLabs

                          Hi all.

                          Just to help out anyone else who get into singleton issues, I also found out that having singletons in a sub-directory doesn't work using set_source_files_properties.

                          Please take a look at this thread.

                          ekkescornerE Offline
                          ekkescornerE Offline
                          ekkescorner
                          Qt Champions 2016
                          wrote on last edited by
                          #13

                          @DrSnowLabs also take a look at https://www.qt.io/blog/implicit-imports-vs.-qml-modules-in-qt-6

                          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

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved