2014-09-30 334 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集)。

相关问题