2010-05-18 179 views
6

我現在正在測試QTreeView功能,並且我爲一件事感到驚訝。看來QTreeView內存消耗取決於項目數O_O。這是非常不尋常的,因爲這種類型的模型視圖容器只跟蹤正在顯示的項目,其餘項目在模型中。我用一個簡單的模型編寫了一個下面的代碼,它不包含任何數據,只是報告它擁有1000萬個項目。使用MFC,使用這種模型的Windows API或.NET樹/列表將不會佔用內存,因爲它只顯示10-20個可見元素,並且會在滾動/擴展項目時請求更多模型。但是用Qt,這樣簡單的模型會導致〜300Mb的內存消耗。越來越多的項目會增加內存消耗。也許任何人都可以暗示我我做​​錯了什麼? :)QTreeView內存消耗

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

必須是我見過的最怪異的代碼樣式之一:) – 2010-05-18 12:13:49

+1

@Idan K:風格被稱爲「可讀」:-)大多數編程風格被稱爲「cram-as-much-on-my-儘可能小的屏幕「,並且來自顯示器爲80x25(字符,而不是像素)的時代。 – 2010-05-18 12:18:00

+2

@aaron:好吧,我不會那麼做,這只是我第一次看到「公開」:每個公共方法的前面,以及參數的風格方式,但我不是批評,只是說我以前沒見過。 :) – 2010-05-18 12:40:47

回答

0

如果我將QTreeView替換爲示例源中的QTableView,內存將不會被使用。所以看起來QListView和QTreeView並不打算用於非常大量的數據,而必須使用QTableView。