我尝试创建一个简单的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
加载另一个文件系统时,此代码都会重置QFileSystemModel
。 Video here - 您可以看到第一次点击新文件夹的方式会将视图重置为模型的根目录。在第二次尝试时,您还可以看到正确的文件夹内容在重置视图之前显示了几分之一秒。
我的想法是,由于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
,它也使用myFileModel
并将模型设为myRootIndex
作为根索引。那一个很完美。它只是ListView(以及GridView),它不起作用。
据我所知,除了TreeView之外,几乎没有关于使用QFileSystemModel
的信息。我喜欢对正在发生的事情的一些意见。