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. accessing aggregates (QVector of a struct)
Forum Updated to NodeBB v4.3 + New Features

accessing aggregates (QVector of a struct)

Scheduled Pinned Locked Moved Solved QML and Qt Quick
52 Posts 4 Posters 8.2k Views 4 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.
  • mzimmersM mzimmers

    @kshegunov OK, I think I understand 1-4. But where is the getData() function explicitly referenced/called? (I think your getData() is the equivalent to my QVariantList BottleList::getBottleListQv().)

    I still don't understand how to retrieve the information to use it in my bottle objects.

            Bottle {
                id: bottle1
                cellX: 25
                cellY: 105
                cellHeight: 75
                cellWidth: 75
                bottleScaleFactor: scaleFactor
                cellText: "W7" // how to replace this with something from getData()?
                cellColor: "red"
            }
    

    Thanks...

    ODБOïO Offline
    ODБOïO Offline
    ODБOï
    wrote on last edited by
    #32

    hi

    @mzimmers said in accessing aggregates (QVector of a struct):

    I still don't understand how to retrieve the information to use it in my bottle objects.

    the answer is

    @kshegunov said in accessing aggregates (QVector of a struct):

    In the above code you attach to the completed signal, then you call the getData to retrieve the list of structs, then forEach of the elements of the array you execute the anonymous function. The function is a dummy mostly. It just needs to go get the reference to the template component (which isn't a visual item, as mentioned) and call it's createObject to create the Text item contained. The first argument of the method is the visual parent (which is the Column in this case) and the second parameter is the set of properties to pass along, which is just the text value retrieved from the structure.

     Column {
           Component.onCompleted: 
        
            DataSource.getData().forEach(function(element) {//anonymous  function call for each object  returned by  getData()
             
               template.createObject(this, { text: element.name }); // create a qml object  using the template and pass  the value retrieved from the structure  ( text:element.name )
           }, this)
        }
    

    Please make an empty project and test one of the examples given by @kshegunov @fcarney or me

    mzimmersM 1 Reply Last reply
    0
    • ODБOïO ODБOï

      hi

      @mzimmers said in accessing aggregates (QVector of a struct):

      I still don't understand how to retrieve the information to use it in my bottle objects.

      the answer is

      @kshegunov said in accessing aggregates (QVector of a struct):

      In the above code you attach to the completed signal, then you call the getData to retrieve the list of structs, then forEach of the elements of the array you execute the anonymous function. The function is a dummy mostly. It just needs to go get the reference to the template component (which isn't a visual item, as mentioned) and call it's createObject to create the Text item contained. The first argument of the method is the visual parent (which is the Column in this case) and the second parameter is the set of properties to pass along, which is just the text value retrieved from the structure.

       Column {
             Component.onCompleted: 
          
              DataSource.getData().forEach(function(element) {//anonymous  function call for each object  returned by  getData()
               
                 template.createObject(this, { text: element.name }); // create a qml object  using the template and pass  the value retrieved from the structure  ( text:element.name )
             }, this)
          }
      

      Please make an empty project and test one of the examples given by @kshegunov @fcarney or me

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

      @LeLev (et al): kshugenov's example does indeed work. I tried modifying it as follows:

          Column {
             property var myArray: []
             Component.onCompleted: DataSource.getData().forEach(function(bottle) {
      //           template.createObject(this, { text: bottle.name });
                 myArray.push(bottle.name)
             }, this)
          Text {
              text: myArray[0]
          }
      

      But I get a runtime error that myArray is not defined. Am I supposed to use something other than a property var for this?

      Thanks...

      ODБOïO 1 Reply Last reply
      0
      • mzimmersM mzimmers

        @LeLev (et al): kshugenov's example does indeed work. I tried modifying it as follows:

            Column {
               property var myArray: []
               Component.onCompleted: DataSource.getData().forEach(function(bottle) {
        //           template.createObject(this, { text: bottle.name });
                   myArray.push(bottle.name)
               }, this)
            Text {
                text: myArray[0]
            }
        

        But I get a runtime error that myArray is not defined. Am I supposed to use something other than a property var for this?

        Thanks...

        ODБOïO Offline
        ODБOïO Offline
        ODБOï
        wrote on last edited by ODБOï
        #34

        @mzimmers said in accessing aggregates (QVector of a struct):

        myArray is not defined

        you need to assign the id of Column so you can access its properties from outside, it is qml basics

        Column {
        id :col
        property var myArray: []
        Text {
        text: col.myArray[0]
        }
        }

        @mzimmers said in accessing aggregates (QVector of a struct):

        kshugenov's example does indeed work.

        it does almost exactly the same thing as my very first example/answer.

        mzimmersM 1 Reply Last reply
        1
        • ODБOïO ODБOï

          @mzimmers said in accessing aggregates (QVector of a struct):

          myArray is not defined

          you need to assign the id of Column so you can access its properties from outside, it is qml basics

          Column {
          id :col
          property var myArray: []
          Text {
          text: col.myArray[0]
          }
          }

          @mzimmers said in accessing aggregates (QVector of a struct):

          kshugenov's example does indeed work.

          it does almost exactly the same thing as my very first example/answer.

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

          @LeLev ah. So, now my code looks like this:

              Column {
                  id: myColumn
                  property var myArray: []
                  Component.onCompleted: DataSource.getData().forEach(function(bottle) {
                      //           template.createObject(this, { text: bottle.name });
                      myArray.push(bottle.name)
                  }, this)
                  Text {
                      text: myColumn.myArray[0]
                  }
                  Text {
                      text:myColumn.myArray[1]
                  }
                  Text {
                      text: myColumn.myArray[2]
                  }
              }
          

          and I'm getting this error: "Unable to assign [undefined] to QString"

          EDIT: I've stepped through this in the debugger, and the array is most definitely being created.

          ODБOïO 1 Reply Last reply
          1
          • mzimmersM mzimmers

            @LeLev ah. So, now my code looks like this:

                Column {
                    id: myColumn
                    property var myArray: []
                    Component.onCompleted: DataSource.getData().forEach(function(bottle) {
                        //           template.createObject(this, { text: bottle.name });
                        myArray.push(bottle.name)
                    }, this)
                    Text {
                        text: myColumn.myArray[0]
                    }
                    Text {
                        text:myColumn.myArray[1]
                    }
                    Text {
                        text: myColumn.myArray[2]
                    }
                }
            

            and I'm getting this error: "Unable to assign [undefined] to QString"

            EDIT: I've stepped through this in the debugger, and the array is most definitely being created.

            ODБOïO Offline
            ODБOïO Offline
            ODБOï
            wrote on last edited by ODБOï
            #36

            @mzimmers said in accessing aggregates (QVector of a struct):

            Column {
            id: myColumn
            property var myArray: []
            Component.onCompleted: DataSource.getData().forEach(function(bottle) {
            // template.createObject(this, { text: bottle.name });
            myArray.push(bottle.name)
            }, this)

            you should not modify myArray directly in the function but create a local array then copy its content into myArray

            Column {
                    id: myColumn
                    property var myArray: []
                    Component.onCompleted: {
                       var arr = []
                       DataSource.getData().forEach(function(bottle) {           
                        //myArray.push(bottle.name)
                          arr.push(bottle.name)
                    }, this);
                  myColumn.myArray = arr;          
            }
            
            mzimmersM 1 Reply Last reply
            3
            • ODБOïO ODБOï

              @mzimmers said in accessing aggregates (QVector of a struct):

              Column {
              id: myColumn
              property var myArray: []
              Component.onCompleted: DataSource.getData().forEach(function(bottle) {
              // template.createObject(this, { text: bottle.name });
              myArray.push(bottle.name)
              }, this)

              you should not modify myArray directly in the function but create a local array then copy its content into myArray

              Column {
                      id: myColumn
                      property var myArray: []
                      Component.onCompleted: {
                         var arr = []
                         DataSource.getData().forEach(function(bottle) {           
                          //myArray.push(bottle.name)
                            arr.push(bottle.name)
                      }, this);
                    myColumn.myArray = arr;          
              }
              
              mzimmersM Offline
              mzimmersM Offline
              mzimmers
              wrote on last edited by
              #37

              @LeLev that works! Thanks for your patience on this.

              May I ask why my approach didn't work?

              ODБOïO 1 Reply Last reply
              0
              • mzimmersM mzimmers

                @LeLev that works! Thanks for your patience on this.

                May I ask why my approach didn't work?

                ODБOïO Offline
                ODБOïO Offline
                ODБOï
                wrote on last edited by ODБOï
                #38

                @mzimmers
                here is an example to illustrate, uncomment one or the other Component.onCompleted, you will observe that when we call
                col.myArr.push("N° " + i) directly, the view is empty at the beginning but myArr actually contains the items

                Window {
                    width: 640
                    height: 480
                    visible: true
                
                    Column{
                        id:col
                        property var myArr : []
                
                // calling myArr.push() directly in the function.
                //   You will need to somehow "refresh" the view, (in this example see the button that resets the repeater model)
                        
                //        Component.onCompleted: {
                //            var arr = []
                //            for(var i=0;i<10;i++){
                //                col.myArr.push("N° " + i)
                //            }
                //        }
                //OR ------------------------------------------
                // creating a local array        
                        
                //        Component.onCompleted: {
                //            var arr = []
                //            for(var i=0;i<10;i++){
                //                arr.push("N° " + i)
                //            }
                //            col.myArr = arr;
                //        }
                
                        //--------------------------------------------------
                        Repeater{
                            id:rep
                            model: col.myArr.length
                
                            Text {
                                id: txt
                                text: col.myArr[index]
                            }
                        }
                        //--------------------------------------------------
                        Button{ 
                            text: 'refresh'
                            onClicked:{ rep.model = 0; rep.model = col.myArr.length;  console.log(col.myArr) } // just to reset the repeater
                        }
                    }
                }
                

                It's great that your solution worked but why not implement something where you can simply write

                 Text {
                            text: DataSource.getDataByIndex(0).name 
                        }
                
                mzimmersM 1 Reply Last reply
                0
                • ODБOïO ODБOï

                  @mzimmers
                  here is an example to illustrate, uncomment one or the other Component.onCompleted, you will observe that when we call
                  col.myArr.push("N° " + i) directly, the view is empty at the beginning but myArr actually contains the items

                  Window {
                      width: 640
                      height: 480
                      visible: true
                  
                      Column{
                          id:col
                          property var myArr : []
                  
                  // calling myArr.push() directly in the function.
                  //   You will need to somehow "refresh" the view, (in this example see the button that resets the repeater model)
                          
                  //        Component.onCompleted: {
                  //            var arr = []
                  //            for(var i=0;i<10;i++){
                  //                col.myArr.push("N° " + i)
                  //            }
                  //        }
                  //OR ------------------------------------------
                  // creating a local array        
                          
                  //        Component.onCompleted: {
                  //            var arr = []
                  //            for(var i=0;i<10;i++){
                  //                arr.push("N° " + i)
                  //            }
                  //            col.myArr = arr;
                  //        }
                  
                          //--------------------------------------------------
                          Repeater{
                              id:rep
                              model: col.myArr.length
                  
                              Text {
                                  id: txt
                                  text: col.myArr[index]
                              }
                          }
                          //--------------------------------------------------
                          Button{ 
                              text: 'refresh'
                              onClicked:{ rep.model = 0; rep.model = col.myArr.length;  console.log(col.myArr) } // just to reset the repeater
                          }
                      }
                  }
                  

                  It's great that your solution worked but why not implement something where you can simply write

                   Text {
                              text: DataSource.getDataByIndex(0).name 
                          }
                  
                  mzimmersM Offline
                  mzimmersM Offline
                  mzimmers
                  wrote on last edited by
                  #39

                  @LeLev I may have spoken a bit too soon...when I try to apply this from the example to my application, I get the error again.

                  Column {
                  	id: myColumn
                  	property var myArray: []
                  	Component.onCompleted: {
                  		var arr = []
                  		BottleList.getBottleListQv().forEach(function(bottle) {
                  			arr.push(bottle.name)
                  		}, this);
                  		myColumn.myArray = arr;
                  	}
                  
                  	Bottle {
                  		cellText: myColumn.myArray[0]//"W7"
                  	}
                  

                  The array element notation seems like it's correct; can you see what I'm doing wrong?

                  Regarding writing a function for the name: I would do that, and I still may, but I want to grow this to return several values in the struct: name, position, capacity, fill level, etc. So far, this approach looks better for that.

                  ODБOïO kshegunovK 2 Replies Last reply
                  0
                  • mzimmersM mzimmers

                    @LeLev I may have spoken a bit too soon...when I try to apply this from the example to my application, I get the error again.

                    Column {
                    	id: myColumn
                    	property var myArray: []
                    	Component.onCompleted: {
                    		var arr = []
                    		BottleList.getBottleListQv().forEach(function(bottle) {
                    			arr.push(bottle.name)
                    		}, this);
                    		myColumn.myArray = arr;
                    	}
                    
                    	Bottle {
                    		cellText: myColumn.myArray[0]//"W7"
                    	}
                    

                    The array element notation seems like it's correct; can you see what I'm doing wrong?

                    Regarding writing a function for the name: I would do that, and I still may, but I want to grow this to return several values in the struct: name, position, capacity, fill level, etc. So far, this approach looks better for that.

                    ODБOïO Offline
                    ODБOïO Offline
                    ODБOï
                    wrote on last edited by ODБOï
                    #40

                    @mzimmers said in accessing aggregates (QVector of a struct):

                    I get the error again.

                    what error do you get ? Did you read/test my example with all the comments about the arrays, i think the error you get is related to that

                    1 Reply Last reply
                    0
                    • mzimmersM mzimmers

                      @LeLev I may have spoken a bit too soon...when I try to apply this from the example to my application, I get the error again.

                      Column {
                      	id: myColumn
                      	property var myArray: []
                      	Component.onCompleted: {
                      		var arr = []
                      		BottleList.getBottleListQv().forEach(function(bottle) {
                      			arr.push(bottle.name)
                      		}, this);
                      		myColumn.myArray = arr;
                      	}
                      
                      	Bottle {
                      		cellText: myColumn.myArray[0]//"W7"
                      	}
                      

                      The array element notation seems like it's correct; can you see what I'm doing wrong?

                      Regarding writing a function for the name: I would do that, and I still may, but I want to grow this to return several values in the struct: name, position, capacity, fill level, etc. So far, this approach looks better for that.

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

                      @mzimmers said in accessing aggregates (QVector of a struct):

                      @LeLev I may have spoken a bit too soon...when I try to apply this from the example to my application, I get the error again.

                      At the time you reference the array it's empty. That's the reason. Component.onCompleted is executed after the property to Bottle.cellText is bound, so the JS engine throws you an error, there's no such thing as myArray[0] at this point; the array is empty.

                      Read and abide by the Qt Code of Conduct

                      mzimmersM 1 Reply Last reply
                      2
                      • mzimmersM mzimmers

                        @kshegunov OK, I think I understand 1-4. But where is the getData() function explicitly referenced/called? (I think your getData() is the equivalent to my QVariantList BottleList::getBottleListQv().)

                        I still don't understand how to retrieve the information to use it in my bottle objects.

                                Bottle {
                                    id: bottle1
                                    cellX: 25
                                    cellY: 105
                                    cellHeight: 75
                                    cellWidth: 75
                                    bottleScaleFactor: scaleFactor
                                    cellText: "W7" // how to replace this with something from getData()?
                                    cellColor: "red"
                                }
                        

                        Thanks...

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

                        @mzimmers said in accessing aggregates (QVector of a struct):

                        I still don't understand how to retrieve the information to use it in my bottle objects.

                        You can instantiate them at runtime (as I did with the text item), you just need to replace the Text with your template for the Bottle. Alternatively you can use the Repeater @LeLev's been pushing, but then set the delegate property to a component which is going to create your bottle items (the repeater with a set delegate pretty much does what my example does). Note I don't know if the model property is going to work with a list of gadgets, you need to check.

                        @LeLev said in accessing aggregates (QVector of a struct):

                        it does almost exactly the same thing as my very first example/answer.

                        Almost but with fewer objects created under the hood. Not that it really matters as the QML engine is an elephant anyway.

                        Read and abide by the Qt Code of Conduct

                        ODБOïO 1 Reply Last reply
                        0
                        • kshegunovK kshegunov

                          @mzimmers said in accessing aggregates (QVector of a struct):

                          I still don't understand how to retrieve the information to use it in my bottle objects.

                          You can instantiate them at runtime (as I did with the text item), you just need to replace the Text with your template for the Bottle. Alternatively you can use the Repeater @LeLev's been pushing, but then set the delegate property to a component which is going to create your bottle items (the repeater with a set delegate pretty much does what my example does). Note I don't know if the model property is going to work with a list of gadgets, you need to check.

                          @LeLev said in accessing aggregates (QVector of a struct):

                          it does almost exactly the same thing as my very first example/answer.

                          Almost but with fewer objects created under the hood. Not that it really matters as the QML engine is an elephant anyway.

                          ODБOïO Offline
                          ODБOïO Offline
                          ODБOï
                          wrote on last edited by ODБOï
                          #43

                          @kshegunov said in accessing aggregates (QVector of a struct):

                          Alternatively you can use the Repeater @LeLev's been pushing

                          I just use a Repeater to answer to this question :

                          @mzimmers said in accessing aggregates (QVector of a struct):

                          @LeLev ah. So, now my code looks like this:
                          Column {
                          id: myColumn
                          property var myArray: []
                          Component.onCompleted: DataSource.getData().forEach(function(bottle) {
                          // template.createObject(this, { text: bottle.name });
                          myArray.push(bottle.name)
                          }, this)
                          Text {
                          text: myColumn.myArray[0]
                          }
                          Text {
                          text:myColumn.myArray[1]
                          }
                          Text {
                          text: myColumn.myArray[2]
                          }
                          }

                          just shorter to write with a repeater
                          i'm really not pushing mzimmers to use it. it was just an example to show what is happening with "property var myArray: []" initialisation

                          mzimmersM kshegunovK 2 Replies Last reply
                          0
                          • kshegunovK kshegunov

                            @mzimmers said in accessing aggregates (QVector of a struct):

                            @LeLev I may have spoken a bit too soon...when I try to apply this from the example to my application, I get the error again.

                            At the time you reference the array it's empty. That's the reason. Component.onCompleted is executed after the property to Bottle.cellText is bound, so the JS engine throws you an error, there's no such thing as myArray[0] at this point; the array is empty.

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

                            @kshegunov said in accessing aggregates (QVector of a struct):

                            @mzimmers said in accessing aggregates (QVector of a struct):

                            @LeLev I may have spoken a bit too soon...when I try to apply this from the example to my application, I get the error again.

                            At the time you reference the array it's empty. That's the reason. Component.onCompleted is executed after the property to Bottle.cellText is bound, so the JS engine throws you an error, there's no such thing as myArray[0] at this point; the array is empty.

                            That makes sense. So, according to the docs, I can use the onCompleted() handler with any object. Can I somehow use it with my Bottle (defined in QML) object?

                            1 Reply Last reply
                            0
                            • ODБOïO ODБOï

                              @kshegunov said in accessing aggregates (QVector of a struct):

                              Alternatively you can use the Repeater @LeLev's been pushing

                              I just use a Repeater to answer to this question :

                              @mzimmers said in accessing aggregates (QVector of a struct):

                              @LeLev ah. So, now my code looks like this:
                              Column {
                              id: myColumn
                              property var myArray: []
                              Component.onCompleted: DataSource.getData().forEach(function(bottle) {
                              // template.createObject(this, { text: bottle.name });
                              myArray.push(bottle.name)
                              }, this)
                              Text {
                              text: myColumn.myArray[0]
                              }
                              Text {
                              text:myColumn.myArray[1]
                              }
                              Text {
                              text: myColumn.myArray[2]
                              }
                              }

                              just shorter to write with a repeater
                              i'm really not pushing mzimmers to use it. it was just an example to show what is happening with "property var myArray: []" initialisation

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

                              @LeLev it's a good suggestion; I'm still looking at the code.

                              I probably don't really need the Column any more, as far as that goes. But I guess I need something to attach the Component.onCompleted() to.

                              1 Reply Last reply
                              0
                              • ODБOïO ODБOï

                                @kshegunov said in accessing aggregates (QVector of a struct):

                                Alternatively you can use the Repeater @LeLev's been pushing

                                I just use a Repeater to answer to this question :

                                @mzimmers said in accessing aggregates (QVector of a struct):

                                @LeLev ah. So, now my code looks like this:
                                Column {
                                id: myColumn
                                property var myArray: []
                                Component.onCompleted: DataSource.getData().forEach(function(bottle) {
                                // template.createObject(this, { text: bottle.name });
                                myArray.push(bottle.name)
                                }, this)
                                Text {
                                text: myColumn.myArray[0]
                                }
                                Text {
                                text:myColumn.myArray[1]
                                }
                                Text {
                                text: myColumn.myArray[2]
                                }
                                }

                                just shorter to write with a repeater
                                i'm really not pushing mzimmers to use it. it was just an example to show what is happening with "property var myArray: []" initialisation

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

                                @LeLev said in accessing aggregates (QVector of a struct):

                                i'm really not pushing mzimmers to use it. it was just an example to show what is happening with "property var myArray: []" initialisation

                                That came out badly. I didn't mean to imply it's wrong in any way, or that your answer is bad. A poor choice of words, sorry.

                                @mzimmers said in accessing aggregates (QVector of a struct):

                                That makes sense. So, according to the docs, I can use the onCompleted() handler with any object. Can I somehow use it with my Bottle (defined in QML) object?

                                Yes all the items can attach to it. Think of it as a "global" signal (sort of).

                                Read and abide by the Qt Code of Conduct

                                ODБOïO 1 Reply Last reply
                                1
                                • kshegunovK kshegunov

                                  @LeLev said in accessing aggregates (QVector of a struct):

                                  i'm really not pushing mzimmers to use it. it was just an example to show what is happening with "property var myArray: []" initialisation

                                  That came out badly. I didn't mean to imply it's wrong in any way, or that your answer is bad. A poor choice of words, sorry.

                                  @mzimmers said in accessing aggregates (QVector of a struct):

                                  That makes sense. So, according to the docs, I can use the onCompleted() handler with any object. Can I somehow use it with my Bottle (defined in QML) object?

                                  Yes all the items can attach to it. Think of it as a "global" signal (sort of).

                                  ODБOïO Offline
                                  ODБOïO Offline
                                  ODБOï
                                  wrote on last edited by ODБOï
                                  #47

                                  @kshegunov no worries , i just wanted to clarify

                                  @mzimmers said in accessing aggregates (QVector of a struct):

                                  Can I somehow use it with my Bottle (defined in QML) object?

                                  you can refactor the code in the Component.onCompleted into a function and call it when you need

                                  mzimmersM 1 Reply Last reply
                                  0
                                  • ODБOïO ODБOï

                                    @kshegunov no worries , i just wanted to clarify

                                    @mzimmers said in accessing aggregates (QVector of a struct):

                                    Can I somehow use it with my Bottle (defined in QML) object?

                                    you can refactor the code in the Component.onCompleted into a function and call it when you need

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

                                    @LeLev somehow, I'm overcomplicating this. I already have a function:

                                        Q_INVOKABLE QString getBottleName(int index) { return m_bottleList[index].m_name; }
                                    

                                    The obstacle here is, anything I do is getting called at program startup, before my data structure is populated (as ksheg indicated). I can't figure out how to "delay" my assignment of the cellText property of the bottle until after that vector/list is built.

                                    kshegunovK 1 Reply Last reply
                                    0
                                    • mzimmersM mzimmers

                                      @LeLev somehow, I'm overcomplicating this. I already have a function:

                                          Q_INVOKABLE QString getBottleName(int index) { return m_bottleList[index].m_name; }
                                      

                                      The obstacle here is, anything I do is getting called at program startup, before my data structure is populated (as ksheg indicated). I can't figure out how to "delay" my assignment of the cellText property of the bottle until after that vector/list is built.

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

                                      @mzimmers said in accessing aggregates (QVector of a struct):

                                      The obstacle here is, anything I do is getting called at program startup, before my data structure is populated (as ksheg indicated). I can't figure out how to "delay" my assignment of the cellText property of the bottle until after that vector/list is built.

                                      You can't, not without going to dynamic creation of the items. The properties are bound (think similar to QObject::connect) when the items are instantiated. Either you use dynamic creation (e.g. what @LeLev and I suggested), or you need to attach to each of the item's you have statically added to your interface and fetch the value in the completed() handler.

                                      <rant>
                                      The docs sing a very smooth song about integrating QML and C++, but the truth is ... well you already know what the truth is. With a couple of exceptions none of the QQuickItems have public interfaces that can be used from C++ and you're stuck jumping trough hoops to tie up the API ...
                                      </rant>

                                      Read and abide by the Qt Code of Conduct

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

                                        So, as currently implemented, even if my backing data is updated, it doesn't do anything for updating the QML screen...is that about right?

                                        If I use the repeater idea, I guess I'll have to use it for my entire object -- in fact, my entire array of objects. Because using it to create an array won't updating anything that uses that array (for the reasons you cited), will it?

                                        kshegunovK 1 Reply Last reply
                                        0
                                        • mzimmersM mzimmers

                                          So, as currently implemented, even if my backing data is updated, it doesn't do anything for updating the QML screen...is that about right?

                                          If I use the repeater idea, I guess I'll have to use it for my entire object -- in fact, my entire array of objects. Because using it to create an array won't updating anything that uses that array (for the reasons you cited), will it?

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

                                          @mzimmers said in accessing aggregates (QVector of a struct):

                                          So, as currently implemented, even if my backing data is updated, it doesn't do anything for updating the QML screen...is that about right?

                                          Very much, yes.

                                          If I use the repeater idea, I guess I'll have to use it for my entire object -- in fact, my entire array of objects. Because using it to create an array won't updating anything that uses that array (for the reasons you cited), will it?

                                          Yes, and you still won't get notifications if the data changes.

                                          If you want to get notifications about data changing in QML, switch to QObject derived classes. And provide a QObject * to the QML, then when you create the items dynamically and you pass on the properties, you pass on as bindings, not values. Then the QObject being changed from the C++ is going to be reflected in the QtQuick scene.

                                          <rant 2>
                                          If QML had a C++ API, you could've derived from the correct item and added the data to the item, not create and instantiate yet another type just for keeping the data ...
                                          </rant 2>

                                          Read and abide by the Qt Code of Conduct

                                          mzimmersM 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