C++ 在ListView中使用QFileSystemModel
我正在尝试创建一个简单的C++ 在ListView中使用QFileSystemModel,c++,qt,qml,qt5,qfilesystemmodel,C++,Qt,Qml,Qt5,Qfilesystemmodel,我正在尝试创建一个简单的ListView,可以使用QFileSystem浏览文件系统 首先,我尝试使用我发现适用于QDirModel的代码: main.qml: ListView { id: list width: 300 height: 500 model: DelegateModel { model: myFileModel delegate: Text{
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);
}
}
}
}
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 );
qdm.setRootPath("/");
engine.rootContext()->setContextProperty("myFileModel", &qdm);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
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();
}
但是,每次QFileSystemModel
加载文件系统的另一部分时,此代码都会重置ListView
您可以看到第一次单击新文件夹如何将视图重置为模型的根目录。在第二次尝试时,您还可以看到,在重置视图之前,正确文件夹的内容会显示几秒钟
我的想法是,由于QFileSystemModel
异步加载其数据,因此模型索引可能在模型更新后失效,从而重置视图。因此,每次发出模型的directoryLoaded
信号时,我都尝试重新分配rootIndex
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);
}
}
}
}
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 );
qdm.setRootPath("/");
engine.rootContext()->setContextProperty("myFileModel", &qdm);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
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
和model asmyRootIndex
作为根索引。这一个很好用。只是ListView(以及GridView)不起作用
据我所知,除了TreeView之外,几乎没有任何关于使用
QFileSystemModel
的信息。我想了解一下正在发生的事情。FolderListModel不是一个有效的选项?它仍然处于“实验室”的边缘,但我认为它像一个魅力。例如,请参阅或在文档中查找。它也应该用于Qt示例,例如着色器效果示例。@BaCaRoZzo我已经看过了FolderListModel
,但它不能很好地处理TreeView
,因为该模型在目标目录中包含的文件/文件夹不多。这没关系,但我也遇到了一些其他问题,例如无法将“/”设置为目标文件夹。它将显示Qt项目目录,而不是显示根目录。而且,底层C++类似乎不可继承,因为它在Qt创建者中没有公开。它似乎纯粹是为了在QML中使用。您想使用ListView
,不是吗?QML用于QAbstractListModel
派生类。您当然可以将其设置为与qabstractemmodel
s一起使用(例如,请参阅我对类似主题的回答)。也就是说,正如我前面所说的,内置示例有一个用QML编写的文件浏览器。你可以找到它。无论如何,解决这里的问题也很有意义。无法详细查看您的代码。希望有人能帮上忙。我想用GridView
,但是为了这个例子,我用了ListView
。这两个问题我都有。我也想创建一个浏览器,所以现在我正在研究如何表示文件系统,不幸的是,Qt的所有解决方案都有一些问题或限制,这使得我很难使用它QFileSystemModel
如果我能让它真正工作,那就太好了。不管怎样,即使你不能直接回答我的问题,你仍然帮助了我。我是Qt5的新手,我吸收了很多信息来学习。我会看看你的链接,也许我能弄明白。