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