2010-05-18 15 views
6

Estoy probando la funcionalidad QTreeView en este momento, y me sorprendió una cosa. Parece que el consumo de memoria de QTreeView depende del recuento de elementos O_O. Esto es muy inusual, ya que los contenedores de vista de modelo de ese tipo solo realizan un seguimiento de los elementos que se muestran, y el resto de los elementos se encuentran en el modelo. He escrito un código siguiente con un modelo simple que no contiene datos y solo informa que tiene 10 millones de elementos. Con MFC, la API de Windows o el árbol/lista .NET con dicho modelo no tomará memoria, ya que mostrará solo de 10 a 20 elementos visibles y solicitará un modelo para más al desplazarse/expandir los elementos. Pero con Qt, un modelo tan simple da como resultado ~ 300Mb de consumo de memoria. El aumento de la cantidad de elementos aumentará el consumo de memoria. ¿Tal vez alguien puede darme pistas de lo que estoy haciendo mal? :)Consumo de memoria QTreeView

#include <QtGui/QApplication> 
#include <QTreeView> 
#include <QAbstractItemModel> 

class CModel : public QAbstractItemModel 
{ 
    public: QModelIndex index 
    (
    int i_nRow, 
    int i_nCol, 
    const QModelIndex& i_oParent = QModelIndex() 
) const 
    { 
    return createIndex(i_nRow, i_nCol, 0); 
    } 

    public: QModelIndex parent 
    (
    const QModelIndex& i_oInex 
) const 
    { 
    return QModelIndex(); 
    } 

    public: int rowCount 
    (
    const QModelIndex& i_oParent = QModelIndex() 
) const 
    { 
    return i_oParent.isValid() ? 0 : 1000 * 1000 * 10; 
    } 

    public: int columnCount 
    (
    const QModelIndex& i_oParent = QModelIndex() 
) const 
    { 
    return 1; 
    } 

    public: QVariant data 
    (
    const QModelIndex& i_oIndex, 
    int i_nRole = Qt::DisplayRole 
) const 
    { 
    return Qt::DisplayRole == i_nRole ? QVariant("1") : QVariant(); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QTreeView oWnd; 
    CModel oModel; 
    oWnd.setUniformRowHeights(true); 
    oWnd.setModel(& oModel); 
    oWnd.show(); 
    return a.exec(); 
} 
+4

que tiene que ser uno de los estilos de código más raro que he visto :) –

+1

@Idan K: El estilo se llama "legible" :-) La mayoría de los estilos de programación se llaman "cram-as-much-on-my- minúscula como sea posible "y fecha de una era donde los monitores eran 80x25 (caracteres, no píxeles). –

+2

@aaron: bueno, no llegaría tan lejos, es la primera vez que veo 'público:' frente a cada método público, y también la forma en que se diseñan los parámetros, pero no criticaba, solo decía no lo he visto antes :) –

Respuesta

0

Si reemplazo QTreeView con QTableView en la fuente de muestra, la memoria no se consumirá. Por lo tanto, parece que QListView y QTreeView no están destinados a ser utilizados con una gran cantidad de datos y QTableView se debe utilizar en su lugar.

Cuestiones relacionadas