4

Qtドキュメントから:

QFileSystemModelは、setRootPath()が呼び出されるまで、ファイルまたはディレクトリーをフェッチしません。これにより、Windowsでドライブを一覧表示するなど、その時点までのファイルシステムでの不要なクエリを防ぐことができます。

QDirModel(廃止)とは異なり、QFileSystemModelは別のスレッドを使用してそれ自体にデータを設定するため、ファイルシステムが照会されているときにメインスレッドがハングすることはありません。rowCount()を呼び出すと、モデルがディレクトリにデータを入力するまで0が返されます。QFileSystemModelは、ファイル情報を含むキャッシュを保持します。キャッシュは、QFileSystemWatcherを使用して自動的に最新の状態に保たれます。

チェック可能なボックスを使用するサブクラス化されたQFileSystemModelと一緒にQTreeViewを使用しています。
ツリーでアイテムが展開される前に呼び出すとQFileSystemModel::rowCount(index)、サブディレクトリまたはファイルがあるかどうかに関係なく、「0」が返されます。ただし、展開されると、再度呼び出されたときに正しい行数が表示されます。

QFileSystemModel :: setRootPath()を呼び出すと、指定されたファイルパスからデータがフェッチされると思いますQFileSystemModel::rowCountが、以下のコードを呼び出す前に、「十分な速度で実行されない」(キャッシュが更新されない)ようです。

// Whenever a checkbox in the TreeView is clicked
bool MyModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
  if (role == Qt::CheckStateRole)
  {
    if (value == Qt::Checked)
    {
      setRootPath(this->filePath(index));
      checklist.insert(index);
      set_children(index);
    }
    else
    {
      checklist.remove(index);
      unchecklist->insert(index);
     }
      emit dataChanged(index, index);
      return true;
   }

  return QFileSystemModel::setData(index, value, role);
}

// Counts how many items/children the node has (i.e. file/folders) 
void MyModel::set_children(const QModelIndex& index)
{
    int row = this->rowCount(index);

    qDebug() << QString::number(row);

}

そのフォルダーに含まれているアイテムの数を数える前に、サブフォルダー情報を先制的に収集する方法はありますか?

ありがとう

4

1 に答える 1

6

QFileSystemModel は、収集スレッドがディレクトリのロードを完了すると、directoryLoaded(const QString &path)シグナルを発行します。

于 2011-09-02T12:59:26.447 に答える