Qtの公式フォーラムに書いたのですが、死んでいるようなのでここにコピペします。
ファイルをコピーするための小さなプログラムを書いています。を使用QTreeView
し、から継承したQFileSystemModel
ので、のすべての行にチェックボックスを追加できましたQTreeView
。setNameFilters
に接続されたメソッドも使用するQLineEdit
ため、ユーザーは に表示するファイル拡張子を指定できますQTreeView
。次の動作を発見しました。
1) プログラムを実行し、フィルタする拡張機能を入力すると ( のノードに触れずにQTreeView
)、すべて正常に動作し、提供した拡張機能を持つファイルのみが表示されます (もちろん、フォルダも表示されます)。拡張子を変更してビューを更新すると、"C:/"
ドライブのすべてが更新され、新しい拡張子のセットのみが表示されます。以前に触れたことのない他のドライブを展開すると、ファイルも正しく表示されます。
2) プログラムを実行して、自分のドライブ"C:/"
と"D:/"
ドライブを展開すると、すべてのディレクトリとファイルが表示されます (予期される動作)。次に、いくつかの拡張機能を作成すると、ビューが更新されます。ドライブを拡張する"C:/"
と、すべて正常に動作し、提供した拡張子を持つファイルのみが表示されます。"D:/"
それから私は運転に行き、ここに問題があります。すべてのファイルを表示します。私が提供したフィルターは無視されます。以前に開いたことのないドライブを開く"E:/"
と、ファイルはドライブのように正しくフィルタリングされます"C:/"
。
setRootPath
私は、この動作はメソッドと関係があると結論付けました。これは、私のQTreeView
唯一の"C:/"
ドライブでフィルターが正しく機能しているためです。フィルターの変更前に拡張された他のすべてのドライブは機能しません。展開されていないものは問題なく動作します。
問題は、これを機能させる方法です。ユーザーがフィルターを変更し、reset() メソッドが起動された後、QTreeView
ルート パスと展開されていない要素だけでなく、全体が更新されますか? すべてのドライブを子として持つルート パスが存在し、期待どおりに動作する可能性がありますか? QTreeView
または、呼び出し先に仮想フォルダーを作成し、"MyComputer"
それをすべてのドライブの親に設定する必要がありますか? しかし、利用可能なすべてのドライブのリストを取得するにはどうすればよいでしょうか?
私が書いたことがあなたにとって明確であり、これを機能させるのを手伝ってくれることを願っています.
編集: 関連するコードを追加します。さらに必要な場合は、お問い合わせください。
//setting up the model and view
QString rPath = "C:/";
rTree_model = new TreeModel(this); //TreeModel inherits from QFileSystemModel
rTree_model->setRootPath(rPath);
ui->rTree->setModel(rTree_model); //applies the model for the qtreeview (ui->rTree)
//(...)
//action when extensions were provided by user
QString extensions = QString(ui->extensionBox->text()); //gets extensions provided by user
QStringList filters;
if(extensions.length() > 0) {
filters = extensions.split(";", QString::SkipEmptyParts); //splits extensions provided with ';' as separator
rTree_model->setNameFilters(filters); //applies filters
ui->rTree->reset(); //resets the view
}