2012-12-06 5 views
1

과 비슷한 QAbstractListModel을 기반으로 ListView 모델을 만들었습니다. 문제는 내 ListView가 모든 행을 표시하지 않지만 초기 표시 가능한 행만 표시한다는 것입니다. 그래서 내가 스크롤 할 때 (또는 가볍게 치기) 검은 공간 만 뚫습니다. ListView에는 count == 0이 있지만 10 개의 요소를 추가 했으므로 count == 10이어야합니다.QML ListView 개수가 0이고 일부 행만 표시됩니다.

내 클래스는 나는 또한 ListView를 모델 나는 또한 언급하고 싶은

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 { } 
     } 

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

QML 코드를 업데이트

// 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(); 
} 

모델 rowCount의를 갱신하는 데 필요한 mothods을 포함 이것은 정적 모델로 잘 동작합니다. 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 자체 대신 모델 개체를 참조해야합니다.

0

약간 늦었습니다 (4 년!), 붙어있는 날 이후에 발견 한이 문제와 관련된 것이 있습니다! 문제는 주로 ListView가 모델을 처리하는 이상한 방식을 기반으로합니다.

내 모델에서 rowCount 메서드를 재정의 한 후 내가 언급 한 정확한 문제에 직면했습니다. 재미있는 점은, 그들은 결코 부름을받지 않는다는 것입니다. 실제로 ListView는 rowCount를 얻기 위해 호출하지 않으며 cacheBuffer 크기 (시스템의 경우 기본값은 512)의 양을 쿼리하므로 항목이 cacheBuffer 크기 이상이거나 사용중인 기본값보다 큰지를 알 수 없습니다 , 그것이 끝까지 스크롤 될 때만 알 수 있습니다.


이것은 다른 사람들의 문제를 밝혀 줄 수 있지만 문제의 해결책은 아닙니다. 귀하의 경우 항목이 많지 않으면 ListView cacheBuffer 크기를 조정하고 필요한만큼 늘리십시오. 요소가 많으면 성능이 크게 저하 될 수 있습니다.