Я тестирую функциональность QTreeView прямо сейчас, и я был поражен одной вещью. Кажется, что потребление памяти QTreeView зависит от O_O количества объектов. Это очень необычно, начиная с контейнеров образцового представления такого типа только отслеживает для объектов, отображаемых, и отдых объектов находится в модели. Я написал следующий код с простой моделью, которая не содержит данных и просто сообщает, что это имеет 10 миллионов объектов. С MFC Windows API или деревом.NET / список с такой моделью не возьмет памяти, так как это отобразит только 10-20 видимых элементов и запросит модель на больше после прокрутки / расширяющиеся объекты. Но с QT, такая простая модель приводит к ~300Mb потреблению памяти. Растущее число объектов увеличит потребление памяти. Возможно, кто-либо может подсказать меня, что я делаю неправильно?:)
#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();
}
Если я заменю QTreeView на QTableView в источнике образцов, память не будет использоваться. Таким образом, кажется, что QListView и QTreeView не предназначены для использования с очень большим объемом данных, и вместо этого следует использовать QTableView.