Change items in a container (e.g. QList)



  • Hi.
    I have a QList<MyClass> and i want to access and change the items in the list. Through google i came up with

    list->operator [](index).setSomeValue();
    

    where list is a pointer to QList.
    I have two questions. Why

    list[index].setSomeValue();
    

    doesnt work? Shouldnt it be the same?
    And the second: when i come to this point "list->operator [] (index)." the qcreator doesnt show me any posibility to chose something in the autocompletion, although when i just type the setSomeValue() after the point it compiles and work?

    Perhas there is a better way to change an item in a container?


  • Qt Champions 2016

    Hi
    is that

    QList<MyClass> mylist;
    OR
    QList<MyClass *> mylist;
    

    as that change the syntax
    version 1 would be
    mylist[index].setSomeValue();
    and version 2 would be
    mylist[index]->setSomeValue();



  • it is

    QList<MyClass> *list = new QList<MyClass>
    

    and when im doing mylist[index].setSomeValue(); is says there is no member named setSomeValue


  • Qt Champions 2016

    class MyClass {
     public:
      void bing() {};
      MyClass() {}
    };
    
      QList<MyClass>* list = new QList<MyClass>;
      MyClass tmp;
      list->append(tmp);
      (*list)[0].bing();
    (delete list;)
    

    Can I ask why you want the list to be a pointer to a list and not just a list?


  • Moderators

    @Maser As @mrjj said: list is a pointer, so you have first to dereference it and then use [] operator:

    (*list)[index].setSomeValue();
    


  • Ah, thanks. I didnt thought of seting parenthesize the dereferencing.
    Well, all the Qt examples create pointer and then create the container on the heap, dont they?


  • Qt Champions 2016

    @Maser
    well the normal case if that its a non pointer
    QList<MyClass *> list;

    but you get same situation if u send it as paramater

    void somefunc( QList<MyClass *> * List);

    somefunc(&list);

    so it really depends on what you do with list and how long it must live.
    (note normally it would be &)



  • I dont understand. What QList<MyClass *> list; benefits me? That i only have to create them once? Doesnt QList<MyClass> *list do the same as i create the items on the heap and pass the pointer around?


  • Qt Champions 2016

    @Maser
    hi
    all QWidgets are QObjects.
    QObjects have copy constructor disabled. They cannot be cloned.
    So you cannot have QWidgets in a list if you define it as
    QList<MyClass>
    IT must be pointers.

    However for you own classes, there is no need for pointers.

    QList<MyClass> *list = pointer to list of objects. Not possible with most QWidgets
    QList<MyClass *> *list = pointer to list of pointers to objects. can contain QWidgets
    QList<MyClass> list; Just a list of Myclasses. ( best option normally)



  • So this means if i have my class derived from QObject, i can only store them as pointers like QList<MyClass *> *list or QList<MyClass *> list ?


  • Qt Champions 2016

    @Maser
    yes correct.



  • A, thanks! One more mystery solved)) I already wondered why when i wanted add to MyClass the abilities from QObject something crash down in my program, so i made some workarounds)


  • Qt Champions 2016

    Also, just as note.
    Most QWidgets takes a parent (another qwidget) in constructor.
    It means the parent now owns the child and will delete it when it dies it self.

    So if you have childs in a list and give them to parents,
    the list should Not delete the childs as the parent will. :)



  • Ye, i stil havent had time to go into that stuff with smartpointers and all)


  • Qt Champions 2016

    @Maser
    well its not so much smart pointers but more a ownership.
    Must Widgets in Qt can own other widgets and will delete them when deleted.

    So often even you new a Qwidget you dont need to delete it yourself as parent will.



  • Yes, but this is stil related to watching for pointers, if they stil good or deleted somewhere else, doesnt it?

    BTW, why cant i mark the thread solved?


  • Qt Champions 2016

    @Maser
    yes watching pointers is always needed :)

    • BTW, why cant i mark the thread solved?
      You might not have asked it as question.
      On first post look in topic tools button.
      There is "Ask as Question"
      Then you can mark it as solved :)


  • Tricky) Thanks.


  • Qt Champions 2016

    @Maser
    yes its slightly funky :)


Log in to reply
 

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