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();
}
che deve essere uno dei più strani stili di codice che ho visto :) –
@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). –
@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 :) –