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

                }
            }
        }

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たびにをリセットします。ビデオはこちら- 新しいフォルダーを初めてクリックすると、ビューがモデルのルートにリセットされる様子を確認できます。2 回目の試行では、ビューがリセットされる前に、正しいフォルダーの内容が一瞬だけ表示されることも確認できます。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);
                    }

                }
            }
        }

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使用する別のインデックスも設定しました。そして、それは完全に機能します。機能しないのは、ListView (および GridView も同様) だけです。myFileModelmyRootIndex

QFileSystemModel私が見る限り、TreeView 以外での使用に関する情報は事実上ありません。何が起こっているのかについての情報が欲しいです。

4

0 に答える 0