将 QFileSystemModel 与 ListView 一起使用

s3r*_*ius 5 c++ qt qfilesystemmodel qml qt5

我正在尝试创建一个简单的ListView,我可以用来浏览文件系统,使用QFileSystem.

首先,我尝试使用我发现适用于 QDirModel 的代码:

主.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);
                    }

                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

主.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();
}
Run Code Online (Sandbox Code Playgroud)

但是,ListView每次QFileSystemModel加载文件系统的另一个部分时,此代码都会重置。此处的视频- 您可以看到首次单击新文件夹如何将视图重置为模型的根目录。在第二次尝试时,您还可以看到在重置视图之前的几分之一秒内显示了正确的文件夹内容。

我的想法是,由于QFileSystemModel异步加载其数据,一旦模型更新,模型索引可能会失效,从而重置视图。所以我试图在rootIndex每次directoryLoaded发射模型信号时重新分配。

主.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);
                    }

                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

主.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();
}
Run Code Online (Sandbox Code Playgroud)

然而,结果是完全一样的。我添加了调试代码,似乎模型正确加载了所有新目录数据,然后更改了视图的 rootIndex。然而,视图每次都会重置。

除此之外,我还设置了一个单独的TreeView,也使用myFileModel和模型myRootIndex作为根索引。那一个完美地工作。只是 ListView(以及 GridView)不起作用。

QFileSystemModel据我所知,几乎没有关于使用TreeView 以外的任何信息的信息。我很想就正在发生的事情提供一些意见。