Я сейчас тестирую функциональность 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();
}