簡體   English   中英

附加到QList的QList

[英]Appending to QList of 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大小為零。 我究竟做錯了什么?

Qt參考說:

常量T&at(int i)常量

但不是:

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(...)版本。

該錯誤必須在以下行中報告:

    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); 返回非const引用。

foreach(T i,container)創建一個副本,如果您對其進行修改,則會修改該副本,而不是原始副本。 因此,應該始終使用foreach(const T&i,container)代替。

或者可以使用另一種從const成員函數獲取值的方法,而不是在調用const函數之后調用函數,而直接使用屬性值來訪問值。 對於該屬性,需要公開訪問。

例如。

class ABC
{
    public:
          int a;

}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM