2014-09-30 332 views
0

我想在樹視圖中選擇一些不同的文件夾。有在QT兩個解析如下: enter image description here如何在QTreeView + QFileSystemModel上添加CheckBox

  1. QTreeView則+ QFileSystemModel,但如何將它添加了treebox?我根本不知道。同時,QFileSystemModel是同步的,所以選擇一個文件夾後,展開目錄,你會發現子文件夾沒有被選中。我該如何解決這個問題?

  2. QTreeView則+ QDirModel,有一個很好的模型,它工作得很好: http://www.programmershare.com/2041913/ 但QDirModel是同步的。所以當選擇一個大文件夾時,我們必須等待很長時間。我們可以接受很長時間,但我怎麼能知道選擇結束了?

無論如何感謝。

+0

你是什麼意思下「我怎麼能知道選擇已完成」?你應該把某個地方放在「確定」按鈕,並點擊後收集選中的項目 – 2014-09-30 16:23:15

+0

當你選擇QDirModel的一個大文件夾,它會花費你5分鐘或更多。因爲它會選擇所有的子文件夾和所有的子文件。所以當所有的選擇完成後,程序應該知道它,所以我們可以恢復光標/向用戶顯示一些消息。 – stlcours 2014-09-30 16:32:46

回答

0

Your example應該調整一下使用QFileSystemModel

訣竅是聲明checkedIndexes設置爲mutable並在CFileSystemModel::data方法中更新它。

QVariant CFileSystemModel::data(const QModelIndex &index, int role) const 
{ 
    if(role == Qt::CheckStateRole) 
    { 
     if (checkedIndexes.contains(index)) 
     { 
      return checkedIndexes.contains(index) ? Qt::Checked : Qt::Unchecked; 
     } 
     else 
     { 
      int checked = Qt::Unchecked; 

      QModelIndex parent = index.parent(); 
      while (parent.isValid()) 
      { 
       if (checkedIndexes.contains(parent)) 
       { 
        checked = Qt::Checked; 
        break; 
       } 

       parent = parent.parent(); 
      } 

      if (checked == Qt::Checked) 
      { 
       checkedIndexes.insert(parent); 
      } 

      return checked; 
     } 
    } 
    else 
    { 
     return QFileSystemModel::data(index, role); 
    } 
} 

當您在一個視圖中打開一個目錄節點,QFileSystemModel開始加載新的內容。加載完成後,視圖使用CFileSystemModel::data函數檢索新數據,該函數檢查是否檢查了新節點流程並返回適當的Qt::CheckStateRole值(並且還更新了checkedIndexes集)。

相關問題