7

我试图在运行时将项目附加到 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 大小为零。我究竟做错了什么?

4

4 回答 4

9

Qt 参考 说:

常量 T & at ( int i ) 常量

但不是:

T& at ( int i )

所以没有非常量版本的at. 你必须operator[]改用。

所以改成:

mylist[z].append(co);

它会起作用。我什至测试了它。

我认为 foreach 版本不起作用,因为 inforeach(QList<customClass> list, mylist) QList<customClass> list不是参考。但foreach(QList<customClass>& list, mylist)不编译。所以你必须使用普通for(...)版本。

于 2010-03-22T15:23:43.890 回答
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 引用。

您应该使用QList::operator[](int i);它返回一个非常量引用。

于 2010-03-22T15:27:54.023 回答
3

foreach( T i, container ) 创建一个副本,如果你修改它,你修改的是副本,而不是原来的。因此,应该始终使用 foreach( const T& i, container) 代替。

于 2010-03-22T21:06:38.630 回答
0

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

例如。

class ABC
{
    public:
          int a;

}

list.at(i).a; 而不是 list.at(i).getValue();

于 2013-01-31T10:48:37.823 回答