将QFileSystemModel与ListView

时间:2016-07-03 12:19:29

标签: c++ qt qml qt5 qfilesystemmodel

我尝试创建一个简单的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加载另一个文件系统时,此代码都会重置QFileSystemModelVideo 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的信息。我喜欢对正在发生的事情的一些意见。

0 个答案:

没有答案