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
集)。
你是什么意思下“我怎么能知道选择已完成”?你应该把某个地方放在“确定”按钮,并点击后收集选中的项目 – 2014-09-30 16:23:15
当你选择QDirModel的一个大文件夹,它会花费你5分钟或更多。因为它会选择所有的子文件夹和所有的子文件。所以当所有的选择完成后,程序应该知道它,所以我们可以恢复光标/向用户显示一些消息。 – stlcours 2014-09-30 16:32:46