2015-08-08 193 views
1

我有一個非常大的樹結構,我不能將完整的樹加載到客戶端的Ram中。我正在使用Qt的QTreeView。在QTreeView異步加載數據

我想在用戶展開元素時動態加載項目的子元素。

當用戶在樹中打開一個項目時是否觸發了一些信號?我正在使用教程Simple Tree Model Example。當我對模型進行更改時,視圖也需要更新。我不想放鬆焦點以避免用戶混淆!

sub elements of tree still loading

和一定的時間(請求到服務器)後...

sub elements of tree finished loading and showing them

回答

1

你需要實現的QAbstractItemModel可以處理所需的數據量的子類。當一個項目在視圖中展開時,它會調用QAbstractItemModel::rowCount來確定兒童數量,然後使用QAbstractItemModel::flagsQAbstractItemModel::data來獲取兒童數據。如果此時請求的數據不可用,則應返回佔位符數據(即包含「正在加載」的1行)並開始請求。收到數據後,發出rowsAboutToBeInsertedrowsInserted信號以通知視圖有關新數據(您還應通知它關於刪除「加載」行)。該視圖將再次調用rowCount,dataflags方法,並且您的模型現在應該提供加載的數據。使用QCache將上次訪問的數據保存在內存中。

+0

你可以添加一些示例代碼? –