Not able to use QList<Class> ComponentA (solved)



  • I am able to read XML element into variable.
    I need to read XML element into a container QList, thus created the 2 class.
    and append the read element into the object.

    class CComponent{
    public:
        QString ComponentID;
        QString ComponentType;
        int ComponentX;
        int ComponentY;
        int ComponentWidth;
        int ComponentHeight;
        int ComponentZOrder;
        int ComponentAspectRatio;
    
    };
    class CBackground{
    public:
        int Transparent;
        int Red;
        int Green;
        int Blue;
    };
    
        QList<CComponent> ComponentA;
        QList<CBackground> BackgroundA;
    
        while (xmlGet.findNextAndDescend("Component"))
        {
            QString ComponentID = xmlGet.getAttributeString("ID","unknown");
            QString ComponentType = xmlGet.getAttributeString("Type","unknown");
            int ComponentX = xmlGet.getAttributeInt("X");
            int ComponentY = xmlGet.getAttributeInt("Y");
            int ComponentWidth = xmlGet.getAttributeInt("Width");
            int ComponentHeight = xmlGet.getAttributeInt("Height");
            int ComponentZOrder = xmlGet.getAttributeInt("ZOrder");
            int ComponentAspectRatio = xmlGet.getAttributeInt("AspectRatio");
    
            ComponentA.append(ComponentID);
            ComponentA.append(ComponentType);
            ComponentA.append(ComponentX);
            ComponentA.append(ComponentY);
            ComponentA.append(ComponentWidth);
            ComponentA.append(ComponentHeight);
            ComponentA.append(ComponentZOrder);
            ComponentA.append(ComponentAspectRatio);
    

  • Moderators

    @alvinNew The List ComponentA is QList of CComponent and you are adding everything other than that. That won't work.
    Store those values you extract from XML in an object of class CComponent and then append that object to ComponentA.



  • I understand and realize that.
    But i do not want to hard-code the variable into ComponentA.
    How to make Component a QList.

    It's ok, i create a Component Template and move the contain variable into list before grabbing new data


  • Moderators

    @alvinNew No need to hard code. You just need to store those values in an object of CComponent and add it to list. Define some setter methods in CComponent for storing values.

    class CComponent{
        public:
        QString ComponentID;
        QString ComponentType;
        ...
    
        void setComponentId(QString id) {
        ComponentID = id;
        }
    
        void setComponentType(QString type) {
        ComponentType = type;
        }
    };
    
    //Then during appending
    
    QList<CComponent> ComponentA;
    while (xmlGet.findNextAndDescend("Component"))
    {
          QString ComponentID = xmlGet.getAttributeString("ID","unknown");
          QString ComponentType = xmlGet.getAttributeString("Type","unknown");
    
           CComponent comp;
           comp.setComponentId(ComponentID); //store values
           comp.setComponentType(ComponentType); //store values
    
           //add that object to QList
           ComponentA.append(comp);
    }
    


  • @p3c0

    Many thanks, i can learn alot from your simple coding.


  • Moderators

    @alvinNew You're Welcome :) Happy Coding ...
    Also use ``` (3 backticks), key just above the tab button on keyboard for posting code blocks.



  • My code is in pastebin, http://pastebin.com/JwKjfW0b
    Like to ask how to read out the data in the class ( CComponent )


  • Moderators

    @houmingc You will need to write getter methods as well which will return the values stored in those variables.



  • Code below is not working although no compiler error

    QList<CComponent> list;
    
       QListIterator<CComponent> i(list);
       while(i.hasNext()){
           qDebug()<<"xxxx is "<<ComponentTemplate.ComponentX;
       }

  • Moderators

    @houmingc You are doing it wrong. First create some getter methods as said earlier. Then you need to cast the item to CComponent in the loop and access the getter methods to get the values stored in it.


  • Moderators

    @houmingc Something like this

    //CComponent class
    
    void CComponent::setId(QString id)
    {
        m_id = id;
    }
    
    QString CComponent::getId()
    {
        return m_id;
    }
    
    QString m_id, m_type;
    

    then to access after appending to list

    QList<CComponent *> m_list;
    ...
    
    CComponent *ca = new CComponent;
    ca->setId("one");
    ca->setType("big");
    ...
    
    m_list.append(ca);
    
    ...
    
    QListIterator<CComponent*> i(m_list);
    while (i.hasNext()) {
        CComponent *comp = qobject_cast<CComponent*>(i.next()); //qobject_cast - if uses QObject
        qDebug() << comp->getId() << comp->getType();
    }
    
    


  • i have an error at cast object
    error: no matching function for call to 'qobject_cast(CComponent* const&)'
    CComponent comp = qobject_cast<CComponent>(i.next());



  • qDebug() << ComponentList[0].GetComponentHeight(); // why accessing ComponentList array return error?


  • Moderators

    @houmingc said:

    i have an error at cast object
    error: no matching function for call to 'qobject_cast(CComponent* const&)'
    CComponent comp = qobject_cast<CComponent>(i.next());

    Try it exactly how I have posted earlier in the example.

    qDebug() << ComponentList[0].GetComponentHeight(); // why accessing ComponentList array return error?

    What error ? ComponentList is a QList, right ?



  • I got the each component display. Thanks.
    No Casting needed.
    How to get 3rd item of the class? i am now wondering if QList should be used instead of QLinkedList

       QLinkedList<CComponent>::iterator iterator;
        for(iterator=ComponentList.begin();iterator != ComponentList.end(); iterator ++)
        {
            qDebug()<<iterator->GetComponentAspectRatio()<<endl;
        }

  • Moderators

    @houmingc Casting will be needed if you use QListIterator.

    QList<CComponent*> m_list;
    
    CComponent *ca = new CComponent;
    ca->setId("one");
    ca->setType("big");
    
    m_list.append(ca);
    
    QListIterator<CComponent*> i(m_list);
    while (i.hasNext()) {
        CComponent *comp = qobject_cast<CComponent*>(i.next()); //qobject_cast - if uses QObject
        qDebug() << comp->getId() << comp->getType(); //access using QListIterator
    }
    
    /*-------------------------------------------------------------*/
    
    qDebug() << m_list[0]->getType() << m_list[0]->getId(); //no need to cast
    

Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.