2010-03-22 9 views
5

Estoy tratando de anexar elementos a un QList en tiempo de ejecución, pero estoy ejecutando un mensaje de error. Básicamente, lo que intento hacer es crear una QList de QLists y agregar algunos objetos customClass a cada una de las listas internas. Aquí está mi código:Anexando a QList de 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(); 
} 

Pero cuando intento compilar la aplicación, Emite este error:

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

también probé la inserción de los objetos usando foreach:

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

se había ido el error, pero los objetos CustomClass no se adjuntaron, pude verificar que mediante el uso de un bucle de depuración en principal que mostró los QLists interiores tamaños como cero. ¿Qué estoy haciendo mal?

+0

Quizás deba decir: "Pero cuando intento compilar la aplicación" en lugar de: "Pero cuando intento ejecutar la aplicación". Correr y compilar son dos cosas diferentes hasta donde yo sé. –

+0

Editado para corregir esa parte. –

+0

Elimine la palabra clave estática de la definición de testlist() o mueva la lista de prueba a público desde los espacios públicos. No creo que Qt admita ranuras estáticas. – erelender

Respuesta

9

Qt referencia dice:

const T & at (int i) const

pero no:

T& at (int i)

lo que no hay versión no const de at. Tienes que usar operator[] en su lugar.

lo que el cambio a:

mylist[z].append(co); 

y funcionará. Incluso lo probé.

Creo que la versión foreach no funciona, porque en foreach(QList<customClass> list, mylist)QList<customClass> list no es una referencia. Pero foreach(QList<customClass>& list, mylist) no compila. Por lo tanto, deberá usar la versión normal for(...).

+0

impresionante, esto fue todo. –

+0

¿Podría explicar por qué el Foreach no funcionó como se esperaba? –

3

el error debe ser reportados en la línea siguiente:

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); devuelve una referencia const al objeto en el índice i.

Debe usar QList::operator[](int i); que devuelve una referencia no const.

3

foreach (T i, contenedor) crea una copia, si la modifica, modifica la copia, no el original. Por lo tanto, siempre se debe utilizar foreach (const T & i, contenedor) en su lugar.

+0

Interesante, gracias! –

0

O puede haber otra forma de obtener valores de las funciones miembro integradas En lugar de llamar funciones después de llamar a una función const, use directamente el valor del atributo para acceder a los valores. Para ese atributo es necesario estar bajo acceso público.

Por ejemplo.

class ABC 
{ 
    public: 
      int a; 

} 

list.at (i) .a; en lugar de list.at (i) .getValue();

Cuestiones relacionadas