2010-03-22 15 views
5

Próbuję dołączyć elementy do QList w czasie wykonywania, ale jestem uruchomiony komunikat o błędzie. Zasadniczo próbuję zrobić QList QLists i dodać kilka obiektów customClass do każdej z wewnętrznych list. Oto mój kod:Dołączanie do QList z QList

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(); 
} 

Ale gdy próbuję skompilować aplikację to wydziela ten błąd:

error: passing `const QList<customClass>' as `this' argument of `void List<T>::append(const T&) [with T = customClass]' discards qualifiers 

że próbował również wkładania obiektów za pomocą foreach:

foreach(QList<customClass> list, mylist){ 
    for(int x=0 ; x<10 ; x++){ 
     list.append(customClass()); 
    } 
} 

Błąd zniknęło, lecz obiekty CustomClass nie zostały dołączone, może zweryfikować, że dzięki zastosowaniu pętli w debugowania głównego, które pokazuje wewnętrzne QLists rozmiary jak zero. Co ja robię źle?

+0

Może powinieneś powiedzieć: "Ale kiedy próbuję skompilować aplikację" zamiast: "Ale kiedy próbuję uruchomić aplikację". Uruchamianie i kompilowanie to dwie różne rzeczy, o ile wiem. –

+0

Edytowane w celu naprawienia tej części. –

+0

Usuń słowo kluczowe static z definicji listy testowej() lub przenieś listę testową do publicznej z publicznych gniazd. Nie sądzę, że Qt obsługuje statyczne sloty. – erelender

Odpowiedz

9

Qt referencyjny mówi:

const T & at (int i) const

ale nie:

T& at (int i)

więc nie ma non-const wersję at. Zamiast tego musisz użyć operator[].

Więc go zmienić na:

mylist[z].append(co); 

i będzie działać. Nawet to testowałem.

Myślę, że wersja foreach nie działa, ponieważ w foreach(QList<customClass> list, mylist)QList<customClass> list nie jest odniesieniem. Ale foreach(QList<customClass>& list, mylist) nie kompiluje się. Więc będziesz musiał użyć normalnej wersji for(...).

+0

niesamowite, to było to. –

+0

Czy mógłbyś wyjaśnić, dlaczego foreach nie zadziałał zgodnie z oczekiwaniami? –

3

Błąd należy zgłaszać na następujący wiersz:

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); zwraca const odwołanie do obiektu w indeksie i.

Powinieneś użyć QList::operator[](int i);, które zwrócą referencję bez stałej.

3

foreach (T, kontener) tworzy kopię, jeśli ją modyfikujesz, modyfikujesz kopię, a nie oryginał. Dlatego należy zawsze używać foreach (const T & i, container).

+0

Interesujące, dzięki! –

0

Lub może być inny sposób na uzyskanie wartości z funkcji składowych stałych Zamiast wywoływania funkcji po wywołaniu funkcji const, bezpośrednio użyj wartości atrybutu, aby uzyskać dostęp do wartości. Ten atrybut musi być pod publicznym dostępem.

Np.

class ABC 
{ 
    public: 
      int a; 

} 

list.at (i) .a; zamiast list.at (i) .getValue();

Powiązane problemy