我正在尝试创建一个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);
}
}
}
}
主.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
但是,每次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);
}
}
}
}
主.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
的,也使用myFileModel
和模型myRootIndex
作为根索引。那一个完美无缺。只是 ListView(以及 GridView)不起作用。
据我所知,几乎没有关于使用QFileSystemModel
除 TreeView 之外的任何东西的信息。我很想对正在发生的事情提供一些意见。