Добавление к QList из QList

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

виджет.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;
    }
};

пользовательский класс.h:

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

основной.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 равны нулю. Что я делаю неправильно?


person liewl    schedule 22.03.2010    source источник
comment
Возможно, вам следует сказать: Но когда я пытаюсь скомпилировать приложение вместо: Но когда я пытаюсь запустить приложение. Насколько я знаю, запуск и компиляция - две разные вещи.   -  person Karl von Moor    schedule 22.03.2010
comment
Отредактировано, чтобы исправить эту часть.   -  person liewl    schedule 22.03.2010
comment
Либо удалите ключевое слово static из определения testlist(), либо переместите список тестов в общедоступный из общедоступных слотов. Я не думаю, что Qt поддерживает статические слоты.   -  person erelender    schedule 22.03.2010
comment
Ах да, он больше не должен был быть слотом, забыл удалить его после того, как использовал его как слот для проверки чего-то.   -  person liewl    schedule 22.03.2010


Ответы (4)


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

const T & at ( int i ) const

но нет:

T& в ( int i )

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

Поэтому измените его на:

mylist[z].append(co);

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

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

person Karl von Moor    schedule 22.03.2010
comment
не могли бы вы уточнить, почему foreach не сработал, как ожидалось? - person liewl; 22.03.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);, которые возвращают неконстантную ссылку.

person Didier Trosset    schedule 22.03.2010

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

person Frank Osterfeld    schedule 22.03.2010

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

Eg.

class ABC
{
    public:
          int a;

}

список.at(i).a; вместо list.at(i).getValue();

person Kartik Sharma    schedule 31.01.2013