5

我正在尝试创建一个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 之外的任何东西的信息。我很想对正在发生的事情提供一些意见。

4

0 回答 0