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

Я пытаюсь добавить объекты к 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 не были добавлены, я мог проверить, что при помощи отладочного цикла в основном, которое показало внутренние размеры QLists нулем. Что я делаю неправильно?

6
задан demonplus 16 November 2015 в 17:24
поделиться

3 ответа

В справочнике Qt говорится:

const T & at (int i) const

, но не:

T & at (int i)

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

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

mylist[z].append(co);

, и все заработает. Я даже тестировал.

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

9
ответ дан 8 December 2019 в 16:00
поделиться

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

3
ответ дан 8 December 2019 в 16:00
поделиться

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

    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); , которые возвращают неконстантную ссылку.

3
ответ дан 8 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: