Я пытаюсь добавить объекты к 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 нулем. Что я делаю неправильно?
В справочнике Qt говорится:
const T & at (int i) const
, но не:
T & at (int i)
, поэтому нет неконстантной версии в
. Вместо этого вы должны использовать оператор []
.
Так что измените его на:
mylist[z].append(co);
, и все заработает. Я даже тестировал.
Я думаю, что версия foreach не работает, потому что в foreach (QList
QList
не является ссылкой. Но foreach (QList
не компилируется. Поэтому вам придется использовать обычную для (...)
версии.
foreach (T i, контейнер) создает копию, если вы изменяете ее, вы изменяете копию, а не оригинал. Таким образом, вместо этого всегда следует использовать foreach (const T & i, container).
Об ошибке необходимо сообщить в следующей строке:
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);
, которые возвращают неконстантную ссылку.