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. Is it possible to dynamically assign a component?
Forum Updated to NodeBB v4.3 + New Features

Is it possible to dynamically assign a component?

Scheduled Pinned Locked Moved Solved QML and Qt Quick
17 Posts 7 Posters 1.2k 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.
  • dheerendraD Offline
    dheerendraD Offline
    dheerendra
    Qt Champions 2022
    wrote on last edited by
    #8

    This is not possible. Better you can look at createQmlObject(..). You can build string dynamically & use for creation of objects.

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

    1 Reply Last reply
    1
    • mzimmersM Offline
      mzimmersM Offline
      mzimmers
      wrote on last edited by
      #9

      Let me ask the question differently, since I still have the feeling I'm overcomplicating this.

      I want a QML object that I can reuse. The object will contain a Drawer, the contents of which will be different for each instance of the object. I also need to pass arguments into the object. How best to do this?

      Thanks...

      TomZT 1 Reply Last reply
      1
      • JoeCFDJ Offline
        JoeCFDJ Offline
        JoeCFD
        wrote on last edited by JoeCFD
        #10

        sounds like you need a model for qml object. The arguments can be defined or stored in the model. Different models are applied to the qml. Check XmlListModel or VisualItemModel out to see if it helps.

        1 Reply Last reply
        0
        • mzimmersM mzimmers

          Let me ask the question differently, since I still have the feeling I'm overcomplicating this.

          I want a QML object that I can reuse. The object will contain a Drawer, the contents of which will be different for each instance of the object. I also need to pass arguments into the object. How best to do this?

          Thanks...

          TomZT Offline
          TomZT Offline
          TomZ
          wrote on last edited by
          #11

          @mzimmers said in Is it possible to dynamically assign a component?:

          I want a QML object that I can reuse. The object will contain a Drawer, the contents of which will be different for each instance of the object. I also need to pass arguments into the object. How best to do this?

          Declarative-ly.

          Take a look at the 'model' property in Repeater, for instance.

          If this is specifically about a Loader, you can use the 'item' property and the onLoaded callback.

          Loader {
              id: foo
              onLoaded: {
                  item.model = something;            
              }
          }
          
          mzimmersM 1 Reply Last reply
          1
          • TomZT TomZ

            @mzimmers said in Is it possible to dynamically assign a component?:

            I want a QML object that I can reuse. The object will contain a Drawer, the contents of which will be different for each instance of the object. I also need to pass arguments into the object. How best to do this?

            Declarative-ly.

            Take a look at the 'model' property in Repeater, for instance.

            If this is specifically about a Loader, you can use the 'item' property and the onLoaded callback.

            Loader {
                id: foo
                onLoaded: {
                    item.model = something;            
                }
            }
            
            mzimmersM Offline
            mzimmersM Offline
            mzimmers
            wrote on last edited by
            #12

            @TomZ thanks for the suggestion. Are you sure your code example is correct? I tried this:

                Loader {
                        id: drawerLoader
                        active: drawer.opened
                        source: tile.drawerFile
                        onLoaded: {
                               item.model = 10;
                           }
                    }
            

            And got an error: Error: Cannot assign to non-existent property "model"

            1 Reply Last reply
            0
            • TomZT Offline
              TomZT Offline
              TomZ
              wrote on last edited by
              #13

              Loader takes a source property which points to your re-usable QML component. (or sourceComponent, check the docs).

              The actual reusable QML component in my example is not listed. It would be the one that has a property QtObject model: null or similar, which it uses internally to 'do stuff'.

              My example is thus purely meant to illustrate the way for you to assign your data to the re-usable component you would write yourself.

              mzimmersM 1 Reply Last reply
              0
              • TomZT TomZ

                Loader takes a source property which points to your re-usable QML component. (or sourceComponent, check the docs).

                The actual reusable QML component in my example is not listed. It would be the one that has a property QtObject model: null or similar, which it uses internally to 'do stuff'.

                My example is thus purely meant to illustrate the way for you to assign your data to the re-usable component you would write yourself.

                mzimmersM Offline
                mzimmersM Offline
                mzimmers
                wrote on last edited by
                #14

                Hey everybody -

                Thanks for all the good suggestions. I fill file them away for future use. For my current issue, here's how I solved it:

                Rectangle {
                    id: tile
                
                    property url drawerFile: "" // supplied by caller
                    property string titleText: "" // supplied by caller
                    property string statusText: "" // supplied by caller
                
                    Drawer {
                        id: drawer
                        
                        Loader {
                            id: drawerLoader
                            anchors.fill: parent
                            active: drawer.opened
                            source: tile.drawerFile
                            onLoaded: {
                                item.titleText = tile.titleText
                                item.statusText = tile.statusText
                            }
                        }
                    }
                }
                

                This is what I was looking for: both the item itself (tile.drawerfile) and arguments to the item (item.titleText and item.statusText) can be expressed with variables (properties).

                Thanks again...

                kshegunovK 1 Reply Last reply
                0
                • mzimmersM mzimmers

                  Hey everybody -

                  Thanks for all the good suggestions. I fill file them away for future use. For my current issue, here's how I solved it:

                  Rectangle {
                      id: tile
                  
                      property url drawerFile: "" // supplied by caller
                      property string titleText: "" // supplied by caller
                      property string statusText: "" // supplied by caller
                  
                      Drawer {
                          id: drawer
                          
                          Loader {
                              id: drawerLoader
                              anchors.fill: parent
                              active: drawer.opened
                              source: tile.drawerFile
                              onLoaded: {
                                  item.titleText = tile.titleText
                                  item.statusText = tile.statusText
                              }
                          }
                      }
                  }
                  

                  This is what I was looking for: both the item itself (tile.drawerfile) and arguments to the item (item.titleText and item.statusText) can be expressed with variables (properties).

                  Thanks again...

                  kshegunovK Offline
                  kshegunovK Offline
                  kshegunov
                  Moderators
                  wrote on last edited by kshegunov
                  #15

                  I imagine what you want is something of this sort:

                  Item
                  {
                      id: tile
                      property alias delegate: loader.source
                      property alias opened: loader.active
                      property string titleText: ""
                      property string statusText: ""
                  
                      Loader {
                          id: loader
                          anchors.fill: parent
                          active: false
                          onLoaded: {
                              item.titleText = Qt.binding(function() { return tile.titleText })
                              item.statusText = Qt.binding(function() { return tile.statusText })
                          }
                      }
                  }
                  

                  You do want the property to update if/when it's changed, and also not to define properties needlessly - just alias what you can.

                  PS.
                  Or even better would be to alias sourceComponent of the Loader, not the url proper.

                  Read and abide by the Qt Code of Conduct

                  mzimmersM 1 Reply Last reply
                  1
                  • kshegunovK kshegunov

                    I imagine what you want is something of this sort:

                    Item
                    {
                        id: tile
                        property alias delegate: loader.source
                        property alias opened: loader.active
                        property string titleText: ""
                        property string statusText: ""
                    
                        Loader {
                            id: loader
                            anchors.fill: parent
                            active: false
                            onLoaded: {
                                item.titleText = Qt.binding(function() { return tile.titleText })
                                item.statusText = Qt.binding(function() { return tile.statusText })
                            }
                        }
                    }
                    

                    You do want the property to update if/when it's changed, and also not to define properties needlessly - just alias what you can.

                    PS.
                    Or even better would be to alias sourceComponent of the Loader, not the url proper.

                    mzimmersM Offline
                    mzimmersM Offline
                    mzimmers
                    wrote on last edited by
                    #16

                    @kshegunov thanks for the suggestions. I'm curious why you think it would be better to use sourceComponent instead of source.

                    kshegunovK 1 Reply Last reply
                    0
                    • mzimmersM mzimmers

                      @kshegunov thanks for the suggestions. I'm curious why you think it would be better to use sourceComponent instead of source.

                      kshegunovK Offline
                      kshegunovK Offline
                      kshegunov
                      Moderators
                      wrote on last edited by kshegunov
                      #17

                      @mzimmers said in Is it possible to dynamically assign a component?:

                      @kshegunov thanks for the suggestions. I'm curious why you think it would be better to use sourceComponent instead of source.

                      It's much more flexible. I can define the component in the source of the user file (the QML that uses the above), or I can instantiate it from a QML file by name, or - god forbid ;) - expose it from C++ ...

                      e.g.

                      Component {
                         id: someComponent
                         ComboBox {}
                      }
                      
                      MyTile {
                         delegate: someComponent
                         opened: true
                         titleText: "whatever"
                      }
                      

                      Read and abide by the Qt Code of Conduct

                      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