QTreeView потребление памяти - PullRequest
6 голосов
/ 18 мая 2010

Я сейчас тестирую функциональность QTreeView, и меня поразила одна вещь. Похоже, что потребление памяти QTreeView зависит от количества элементов O_O. Это весьма необычно, поскольку контейнеры вида модели такого типа отслеживают только отображаемые элементы, а остальные элементы находятся в модели. Я написал следующий код с простой моделью, которая не содержит данных и просто сообщает, что в ней 10 миллионов элементов. С MFC, Windows API или .NET дерево / список с такой моделью не займет памяти, так как он будет отображать только 10-20 видимых элементов и запросит модель для большего количества при прокрутке / расширении элементов. Но с Qt такая простая модель приводит к потреблению ~ 300 Мб памяти. Увеличение количества элементов увеличит потребление памяти. Может быть, кто-нибудь может намекнуть мне, что я делаю не так? :)

#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();
}

1 Ответ

0 голосов
/ 25 мая 2010

Если я заменю QTreeView на QTableView в исходном коде, память не будет расходоваться. Таким образом, кажется, что QListView и QTreeView не предназначены для использования с очень большим объемом данных, и вместо этого следует использовать QTableView.

...