Присоединение к QList QList - PullRequest
       13

Присоединение к QList QList

5 голосов
/ 22 марта 2010

Я пытаюсь добавить элементы в QList во время выполнения, но я запускаю сообщение об ошибке. По сути, я пытаюсь создать QList из QLists и добавить несколько объектов customClass в каждый из внутренних списков. Вот мой код:

widget.h:

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

public slots:
    static QList<QList<customClass> > testlist(){
        QList<QList<customClass> > mylist;
        for(int w=0 ; w<5 ; w++){
            mylist.append(QList<customClass>());
        }
        for(int z=0 ; z<mylist.size() ; z++){
            for(int x=0 ; x<10 ; x++){
                customClass co = customClass();
                mylist.at(z).append(co);
            }
        }
        return mylist;
    }
};

customclass.h:

class customClass
{
public:
    customClass(){
        this->varInt = 1;
        this->varQString = "hello world";
    }
    int varInt;
    QString varQString;
};

main.cpp:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    QList<QList<customClass> > list;
    list = w.testlist();
    w.show();
    return a.exec();
}

Но когда я пытаюсь скомпилировать приложение, оно выдает эту ошибку:

error: passing `const QList<customClass>' as `this' argument of `void List<T>::append(const T&) [with T = customClass]' discards qualifiers

Я также попытался вставить объекты, используя foreach:

foreach(QList<customClass> list, mylist){
    for(int x=0 ; x<10 ; x++){
        list.append(customClass());
    }
}

Ошибка исчезла, но объекты customClass не были добавлены, я мог убедиться в этом с помощью цикла отладки в main, который показал размеры внутреннего QLists как ноль. Что я делаю не так?

Ответы [ 4 ]

9 голосов
/ 22 марта 2010

Справочник по Qt гласит:

const T & at (int i) const

но не:

T & at (int i)

так что нет неконстантной версии at. Вместо этого вы должны использовать operator[].

Так что измените его на:

mylist[z].append(co);

и это будет работать. Я даже проверил это.

Я думаю, что версия foreach не работает, потому что в foreach(QList<customClass> list, mylist) QList<customClass> list нет ссылки. Но foreach(QList<customClass>& list, mylist) не компилируется. Так что вам придется использовать обычную for(...) версию.

3 голосов
/ 23 марта 2010

foreach (T i, container) создает копию, если вы ее изменяете, вы изменяете копию, а не оригинал. Таким образом, вместо него всегда следует использовать foreach (const T & i, container).

3 голосов
/ 22 марта 2010

Ошибка должна быть сообщена в следующей строке:

    for(int z=0 ; z<mylist.size() ; z++){
        for(int x=0 ; x<10 ; x++){
            customClass co = customClass();
            mylist.at(z).append(co);           // Error is here
        }
    }

QList::at(int); возвращает константную ссылку на объект с индексом i.

Вы должны использовать QList::operator[](int i);, который возвращает неконстантную ссылку.

0 голосов
/ 31 января 2013

Или может быть другой способ получения значений из константных функций Вместо вызова функций после вызова константной функции, непосредственно используйте значение атрибута для доступа к значениям. Для этого атрибут должен быть в открытом доступе.

Например.

class ABC
{
    public:
          int a;

}

list.at (я) .a; вместо list.at (i) .getValue ();

...