ListView
を使用して、ファイル システムを参照するために使用できる単純なものを作成しようとしていますQFileSystem
。
まず、QDirModel で動作することがわかったコードを使用しようとしました。
main.qml:
ListView {
id: list
width: 300
height: 500
model: DelegateModel {
model: myFileModel
delegate: Text{
id: txt
text: fileName
MouseArea {
anchors.fill: parent
onClicked: {
//Switch directory when clicked
list.model.rootIndex = list.model.modelIndex(index);
}
}
}
}
main.cpp:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
QFileSystemModel qdm;
qdm.setFilter( QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files );
qdm.setRootPath("/");
engine.rootContext()->setContextProperty("myFileModel", &qdm);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
ただし、このコードは、ファイルシステムの別の部分をロードするListView
たびにをリセットします。ビデオはこちら- 新しいフォルダーを初めてクリックすると、ビューがモデルのルートにリセットされる様子を確認できます。2 回目の試行では、ビューがリセットされる前に、正しいフォルダーの内容が一瞬だけ表示されることも確認できます。QFileSystemModel
私の考えでは、QFileSystemModel
データを非同期にロードするため、モデルが更新されるとモデルのインデックスが無効になり、ビューがリセットされる可能性があります。そのため、モデルの信号が発信されるrootIndex
たびに を再割り当てしようとしました。directoryLoaded
main.qml:
ListView {
id: list
width: 300
height: 500
model: DelegateModel {
model: myFileModel
property var ind: myModelIndex
onIndChanged: {
rootIndex = myModelIndex //manually reassign root
}
delegate: Text{
id: txt
text: fileName
MouseArea {
anchors.fill: parent
onClicked: {
list.model.rootIndex = list.model.modelIndex(index);
}
}
}
}
main.cpp:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
QFileSystemModel qdm;
qdm.setFilter( QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files );
QObject::connect(&qdm, &QFileSystemModel::directoryLoaded, [&](const QString& path){
//Update model index after directory completely loaded
engine.rootContext()->setContextProperty("myModelIndex", qdm.index(path));
});
qdm.setRootPath("/");
engine.rootContext()->setContextProperty("myModelIndex", qdm.index(""));
engine.rootContext()->setContextProperty("myFileModel", &qdm);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
ただし、結果はまったく同じです。デバッグ コードを追加したところ、モデルがすべての新しいディレクトリ データを適切にロードしたようで、ビューの rootIndex が変更されました。それでも、ビューは毎回リセットされます。
それに加えて、ルート インデックスとしてモデルをTreeView
使用する別のインデックスも設定しました。そして、それは完全に機能します。機能しないのは、ListView (および GridView も同様) だけです。myFileModel
myRootIndex
QFileSystemModel
私が見る限り、TreeView 以外での使用に関する情報は事実上ありません。何が起こっているのかについての情報が欲しいです。