【问题标题】:QTreeView memory consumptionQTreeView 内存消耗
【发布时间】:2010-05-18 12:01:54
【问题描述】:

我现在正在测试 QTreeView 的功能,我对一件事感到惊讶。似乎 QTreeView 内存消耗取决于项目计数 O_O。这是非常不寻常的,因为这种类型的模型视图容器只跟踪正在显示的项目,其余项目都在模型中。我用一个简单的模型编写了以下代码,该模型不包含任何数据,只报告它有 1000 万个项目。使用 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();
}

【问题讨论】:

  • 这一定是我见过的最奇怪的代码样式之一 :)
  • @Idan K:这种风格被称为“可读” :-) 大多数编程风格被称为“cram-as-much-on-my-tiny-screen-as-possible”并且日期来自显示器是 80x25(字符,而不是像素)的时代。
  • @aaron: 好吧,我不会走那么远,这只是我第一次看到public: 在每个公共方法的前面,还有参数的样式,但我不是不是批评,只是说我以前没见过。 :)
  • 通常我将样式简化为更常见的样式 - 使用 dence 线和没有符号。但是对于这样的代码示例,这将花费大量时间:(。对于可读性,我深表歉意。
  • "public:" 前面的每个方法都来自 C#/Java。如果您通过 IDE 'go to definition' 搜索大型项目,它会增加一点可读性。

标签: qt qtreeview


【解决方案1】:

如果我在示例源中将 QTreeView 替换为 QTableView,则不会消耗内存。所以看起来 QListView 和 QTreeView 不打算用于非常大的数据量,而必须使用 QTableView 。

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 2011-10-03
    • 2012-11-24
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多