2011-04-27 22 views
6

Esta es mi primera pregunta sobre QT. Generalmente soy programador de C#, así que discúlpeme por hacer una pregunta estúpida para la cual estoy seguro de que hay una respuesta muy simple, que parece que no puedo encontrar. :QT4 QstringListModel en QListView

Quiero agregar elementos a una lista, por el momento digamos que son cadenas. Tengo un QListView: UI->listView, un QStringList, y una QStringListModel:

stringList = new QStringList(); 
stringList->append("ABC"); 
stringList->append("123"); 

listModel = new QStringListModel(*stringList, NULL); 
ui->listView->setModel(listModel); 

stringList->append("xyz"); 

En este ejemplo se compila y disaplys "ABC" y "123" en mi lista, pero no "xyz". Por qué no? ¿Debo volver a pintar la lista de alguna manera? ¿He hecho algo mal con el NULL?

Gracias.

+0

Nota: No es necesario crear QStringLists en el montón. Los contenedores se comparten implícitamente y generalmente se pasan por value/const ref. –

+0

Sí. En Qt, puede pasar instancias de may (por ejemplo, de QString, QList) por valor sin ninguna sobrecarga computacional. [mira aquí] (http://doc.qt.nokia.com/4.4/shared.html#implicit-sharing) –

Respuesta

5

has modificado el QStringList, es necesario modificar el modelo:

stringList->append("xyz"); 
listModel->setStringList(*stringList); 
23

Si con frecuencia necesario modificar la lista de cadenas y tienen unas vistas conectados que necesitan ser actualizados, usted podría considerar la supresión de QStringList en primer lugar y únicamente utilizando QStringListModel. Puede agregar/eliminar datos allí usando insertRows/removeRows y setData. Esto garantiza que las vistas siempre reflejen el modelo de la manera que usted esperaría. Esto podría envolverse para evitar el trabajo tedioso. Algo así como (no probado):

class StringList : public QStringListModel 
{ 
public: 
    void append (const QString& string){ 
    insertRows(rowCount(), 1); 
    setData(index(rowCount()-1), string); 
    } 
    StringList& operator<<(const QString& string){ 
    append(string); 
    return *this; 
    } 
};