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. Access to an array from dynamically created element
QtWS25 Last Chance

Access to an array from dynamically created element

Scheduled Pinned Locked Moved QML and Qt Quick
3 Posts 2 Posters 2.0k Views
  • 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.
  • M Offline
    M Offline
    michprev
    wrote on last edited by
    #1

    Hi,
    I create dynamically some MyElements.qml on the main page and I save them into an array (I do this from main.qml).
    Then I dynamically create MyCategoryElements.qml and when I click on them, I want to update existing MyElements.qml (I do this from MyCategoryElements.qml).
    Problem is that when I try to update elements from my array, the array does not exist because I can not get it from dynamically created element.

    1 Reply Last reply
    0
    • D Offline
      D Offline
      dridk
      wrote on last edited by
      #2

      Could you add your exemple please ?

      Nothing in Biology Makes Sense Except in the Light of Evolution

      1 Reply Last reply
      0
      • M Offline
        M Offline
        michprev
        wrote on last edited by
        #3

        Ok.

        main.qml
        @
        import QtQuick 1.0
        import "api.js" as Api

        Rectangle {
        Rectangle {
        id: content
        }
        Rectangle {
        id: categoryItems
        }
        Component.onCompleted: {
        Api.getResponse("category-apps", categoryItems, "CategoryItem.qml");
        Api.getResponse("app-list-homepage&count=10", content, "CategoryApps.qml");
        }
        }@

        api.js
        @
        function getResponse(type, parentx, elem) {
        var xml = new XMLHttpRequest;
        xml.onreadystatechange = function() {
        if (xml.readyState == XMLHttpRequest.DONE) {
        var b = xml.responseXML.documentElement;

               if (type.split("&")[0] == "app-list-homepage") {
        
               if (components.length < b.childNodes.length) { // if I need to display more items than I created
                   for (var xx = 0; xx < components.length; xx++) {
                       var a = b.childNodes[xx];
                       update(a.childNodes[10].firstChild.nodeValue, a.childNodes[2].firstChild.nodeValue,                 a.childNodes[6].firstChild.nodeValue, a.childNodes[16].firstChild.nodeValue, xx, a.childNodes[0].firstChild.nodeValue);
                   }
                   for (var xx = components.length; xx < b.childNodes.length - components.length + xx; xx++) {
                       var a = b.childNodes[xx];
                       createElementObjects(elem, parentx, a.childNodes[10].firstChild.nodeValue, a.childNodes[2].firstChild.nodeValue, a.childNodes[6].firstChild.nodeValue, a.childNodes[16].firstChild.nodeValue, xx, a.childNodes[0].firstChild.nodeValue);
                   }
               }
               else if (components.length == b.childNodes.length) { // if I need to display same items as I created
                   for (var xx = 0; xx < components.length; xx++) {
                       var a = b.childNodes[xx];
                       update(a.childNodes[10].firstChild.nodeValue, a.childNodes[2].firstChild.nodeValue, a.childNodes[6].firstChild.nodeValue, a.childNodes[16].firstChild.nodeValue, xx, a.childNodes[0].firstChild.nodeValue);
                   }
               }
               else if (components.length > b.childNodes.length) { // if I need to display fewer items than I created
                   for (var xx = 0; xx < b.childNodes.length; xx++) {
                       var a = b.childNodes[xx];
                       update(a.childNodes[10].firstChild.nodeValue, a.childNodes[2].firstChild.nodeValue, a.childNodes[6].firstChild.nodeValue, a.childNodes[16].firstChild.nodeValue, xx, a.childNodes[0].firstChild.nodeValue);
                   }
                   for (var xx = b.childNodes.length; xx <= components.length; xx++) {
                       components[components.length - 1].destroy();
                       components.pop();
                   }
               }
        
               }
        
               else if (type.split("&")[0] == "category-apps") {
                   categoryList.contentHeight = b.childNodes.length * 80 + 80;
                   for (var xx = 0; xx < b.childNodes.length; xx++) {
                       var a = b.childNodes[xx];
                       createElementObjects(elem, parentx, a.childNodes[3].firstChild.nodeValue, a.childNodes[1].firstChild.nodeValue, null, null, xx, a.childNodes[0].firstChild.nodeValue);
                   }
               }
        
           }
        }
        
        var fullURL = "adress.aspx?type=" + type + "&OsPlatform=Symbian&";
        
        fullURL += "nocache=" + (new Date().getTime());
        xml.open("GET", fullURL);
        xml.send();
        

        }

        var component;
        var element;
        var components = [];

        function createElementObjects(elem, parentx, icon, name, category, rate, ii, id) {
        component = Qt.createComponent(elem);
        if (component.status == Component.Ready)
        finishCreation(parentx, icon, name, category, rate, ii, id);
        else {
        component.statusChanged.connect(finishCreation(parentx, icon, name, category, rate, ii, id));
        }
        }

        function finishCreation(parentx, icon, name, category, rate, ii, id) {
        element = component.createObject(parentx);

        element.icon = icon;
        if (parentx == content) {
            components[ii] = element;
            element.name = name;
            element.category = category;
            element.rate = "images/" + rate + "stars.png";
            element.y = ii * 81 + 120;
            element.id = id;
        }
        else {
            element.icon = icon;
            element.text = name;
            element.id = id;
            element.y = ii * 80 + 80;
        }
        

        }

        function update(icon, name, category, rate, ii, id) {
        components[ii].icon = icon;
        components[ii].name = name;
        components[ii].category = category;
        components[ii].rate = "images/" + rate + "stars.png";
        components[ii].y = ii * 81 + 120;
        components[ii].id = id;
        }
        @

        CategoryItems.qml
        @
        import QtQuick 1.0
        import "api.js" as Api

        ...
        MouseArea {
        width: 360
        height: 80
        onClicked: {
        Api.getResponse("app-list-recommanded&count=100&CategoryID=" + categoryId.text, content, "CategoryApps.qml");
        }
        }
        ...
        @

        So after main.qml load I create categories and then items in the content rectangle. There are 10 items in the content rectangle (and components array too).
        When I click on one of category rectangles I have an empty components array because main.qml variables are not in dynamically created CategoryItems.qml.

        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