2010-05-18 19 views
6

Sto testando la funzionalità QTreeView in questo momento e sono rimasto sorpreso da una cosa. Sembra che il consumo di memoria di QTreeView dipenda dagli oggetti conteggiati O_O. Ciò è altamente inusuale, dal momento che i contenitori di visualizzazione del modello di questo tipo tengono traccia solo degli oggetti visualizzati e il resto degli elementi si trova nel modello. Ho scritto un codice seguente con un modello semplice che non contiene dati e riporta solo che contiene 10 milioni di elementi. Con MFC, Windows API o .NET tree/list con tale modello non prenderà memoria, dal momento che visualizzerà solo 10-20 elementi visibili e richiederà il modello per ulteriori elementi di scorrimento/espansione. Ma con Qt, un modello così semplice risulta in un consumo di memoria di ~ 300Mb. L'aumento del numero di elementi aumenterà il consumo di memoria. Forse qualcuno può suggerirmi cosa sto facendo di sbagliato? :)QTreeView consumo di memoria

#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

che deve essere uno dei più strani stili di codice che ho visto :) –

+1

@Idan K: Lo stile è chiamato "leggibile" :-) La maggior parte degli stili di programmazione si chiama "cram-as-much-on-my- "il più piccolo schermo possibile" e la data di un'epoca in cui i monitor erano 80x25 (caratteri, non pixel). –

+2

@aaron: beh, non andrei così lontano, è solo la prima volta che vedo 'public:' di fronte a ogni metodo pubblico, e anche il modo in cui i parametri sono in stile, ma non stavo criticando, semplicemente dicendo non l'ho mai visto prima :) –

risposta

0

Se si sostituisce QTreeView con QTableView nella sorgente di esempio, la memoria non verrà consumata. Sembra quindi che QListView e QTreeView non siano destinati a essere utilizzati con una grande quantità di dati e che sia invece necessario utilizzare QTableView.

Problemi correlati