附加到QList的QList

时间:2010-03-22 15:08:33

标签: c++ qt qlist

我正在尝试在运行时将项附加到QList,但我正在运行错误消息。基本上我要做的是创建QLists的QList并为每个内部列表添加一些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 个答案:

答案 0 :(得分:9)

Qt参考说:

  

const T&amp; 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(...)版本。

答案 1 :(得分:3)

必须在以下行报告错误:

    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处对象的const引用。

您应该使用返回非const引用的QList::operator[](int i);

答案 2 :(得分:3)

foreach(T i,container)创建一个副本,如果修改它,则修改副本,而不是原始副本。因此,应该总是使用foreach(const T&amp; i,container)。

答案 3 :(得分:0)

或者可以有另一种从const成员函数获取值的方法 不是在调用const函数之后调用函数,而是直接使用属性值来访问值。 因为该属性需要在公共访问下。

EG。

class ABC
{
    public:
          int a;

}

list.at(ⅰ).A;而不是list.at(i).getValue();