2012-11-05 16 views
6

Tôi có một ListView QML, trong đó đại biểu là C++ thực gắn liền với thành phần thiết bị, sử dụng các chủ đề và QWidgets.Làm thế nào để vô hiệu hóa năng động quản lý đối tượng khi nhìn thấy các mục trong qml listview thay đổi?

Nhưng khi tôi cuộn ListView, hoặc mở rộng các đại biểu đến cửa sổ chương trình - không nhìn thấy đại biểu bị phá hủy.

Tôi có thể làm gì để lưu các đại biểu trong số ListModel của mình?

mã ví dụ của tôi:

import Qt 4.7 

    Rectangle { 
    width: 320; height: 200; color: "white" 
    Text { 
     id: debugText 
     font.pixelSize: 24 
     color:"blue" 
     text: "count of created delegates: " + added.toString() 
    } 
    property int added: 0 
    Component { 
     id: delegate 
     Item { 
      id: wrapper 
      Component.onCompleted: added += 1 
      width: 180; height: 50 
      Column { 
       x: 5; y: 5 
       Text { text: '<b>Name:</b> ' + name } 
       Text { text: '<b>Number:</b> ' + number } 
      } 
     } 
    } 
    ListView { 
     width: parent.width; height: parent.height 
     model: contactModel 
     delegate: delegate 
    } 

    ListModel { 
     id: contactModel 
     ListElement { 
      name: "Bill Smith" 
      number: "555 3264" 
     } 
     ListElement { 
      name: "John Brown" 
      number: "555 8426" 
     } 
     ListElement { 
      name: "Sam Wise" 
      number: "555 0473" 
     } 
     ListElement { 
      name: "Bill Smith" 
      number: "555 3264" 

     } 
     ListElement { 
      name: "John Brown" 
      number: "555 8426" 
     } 
     ListElement { 
      name: "Sam Wise" 
      number: "555 0473" 
     } 
    } 
} 

Cảm ơn! Tôi giải quyết vấn đề! Cách đầu tiên - tôi tạo đối tượng Flickable, Column and Repeater và giải pháp này phù hợp với tôi. Cách thứ hai - đối với nhiều lưới trong giao diện chính (chương trình giống như SCADA) tôi sử dụng QObjectList, trong đó mỗi đối tượng là QObjectList, trong đó mỗi đối tượng là DataObject của tôi :)

Trả lời

5

Những gì bạn có thể làm để giữ cho ListView không phá hủy các đại biểu để gán một giá trị lớn cho thuộc tính cacheBuffer của ListView (http://doc-snapshot.qt-project.org/4.8/qml-listview.html#cacheBuffer-prop). Đây rõ ràng là một hack và không phải là một cách tiếp cận được đề nghị. Lưu trữ bất kỳ trạng thái nào trong một đại biểu là một ý tưởng tồi.

Điều bạn nên làm là quản lý các đối tượng gốc riêng biệt trong mô hình C++, nơi bạn có thể kiểm soát tuổi thọ của từng đối tượng như bạn muốn.

+0

Thuộc tính cacheBuffer: int – ctinka