2012-12-06 214 views
1

我創建了一個基於QAbstractListModel的ListView模型,類似於此。 問題是我的ListView不顯示所有行,但只有那些初始化可見。所以當我滾動(或輕彈)只有黑色空間。 ListView的計數== 0,但它應該有count == 10,因爲我已經添加了10個元素。QML ListView計數爲零,只有一些行可見

我的類包含必要的mothods更新模型rowCount時

// needed as implementation of virtual method 
int rowCount(const QModelIndex & parent) const { 
    return standings.size(); 
} 
int rowCount() { 
    return standings.size(); 
} 

void addStanding(const Standing &st) { 
    beginInsertRows(QModelIndex(), rowCount(), rowCount()); 
    qDebug() << "row cnt: " << rowCount(); 
    standings << st; 
    endInsertRows(); 
} 

我也更新ListView控件模型

rootContext = (QDeclarativeContext*)(viewer->rootContext()); 
rootContext->setContextProperty("myModel", &sm); 

QML代碼

ListView { 
      id: raceList 
      objectName: "standingList" 
      y: header.height 
      width: parent.width 
      height: parent.height - header.height 
      clip: true 
      model: myModel 
      delegate: rowComp 
     } 
     Component { 
      id: rowComp 
      SessionRowDelegate { } 
     } 

我也想提這與靜態模型很好地工作。 如何使ListView始終顯示所有項目,而不僅僅在用戶可見時才顯示所有項目?

SessionRowDelegate

Rectangle { 
    id: rowbg 
    width: parent.width 
    height: 34 * (1 + (parent.width - 360) * 0.002) 

    // contains other elements with height not exceeding rowbg's height 
    // ... 
} 
+0

您可以發表QML代碼嗎? –

+0

如何使SessionRowDelegate看起來像?最重要的是,列表視圖的所有行都是統一的高度?如果不是,ListView將無法正常工作。 – sebasgo

+0

是的,SessionRowDelegate的高度已設置。列表視圖的所有行都具有統一的高度。 – dbow

回答

0

一個ListView只呈現當前可見加上預呈現滾動時要顯示的一小部分的元件。出於性能原因,默認實現不會呈現所有這些內容。對列表大小的任何引用都應引用模型對象而不是ListView本身。

0

這有點晚(4年!),但是有一些事情與我在卡住的日子後發現的這個問題有關!問題主要是基於ListView處理模型的奇怪方式。

在我自己的模型中覆蓋rowCount方法後,我遇到了你提到的確切問題。有趣的是,他們從未被稱爲。實際上,ListView從來不會調用獲取rowCount,而是查詢cacheBuffer大小(我的系統上默認爲512)中的金額,這就是爲什麼它不會注意到這些項是否超過了cacheBuffer大小或者它正在使用的默認值它只會注意到當它滾動到最後。


雖然這會揭示一些其他人的問題,但這不是解決您的問題的方法。在你的情況下,如果項目不是那麼多,我建議調整ListView cacheBuffer大小,並儘可能多地增加它。請記住,如果您的元素數量衆多,可能會造成巨大的性能損失。