Как заставить QFileSystemModel работать с ListView

#c #qt #qml

#c #qt #qml

Вопрос:

Я не могу заставить QFileSystemModel работать вместе с ListView. Все примеры и документация, которые я нашел, будут использовать QFileSystemModel с TreeView (который работает нормально), но это не то, что мне нужно.

Я также не хочу использовать тип FolderListModel QML, потому что я хочу позже добавить дополнительные роли в свою модель и редактировать / удалять файлы и папки из приложения.

Я использовал DelegateModel, чтобы иметь возможность устанавливать другой корневой индекс. По какой-то причине мои файлы корректно отображаются в течение доли секунды, а затем представление переходит в корень моей файловой системы. Я не уверен, что происходит, возможно, индексы каким-то образом признаны недействительными.

Ниже приведен пример моего кода:

main.cpp

     QFileSystemModel *fsm = new QFileSystemModel(amp;engine);
    fsm->setRootPath(QDir::homePath());
    fsm->setResolveSymlinks(true);
    engine.rootContext()->setContextProperty("displayFileSystemModel", fsm);
    engine.rootContext()->setContextProperty("rootPathIndex", fsm->index(fsm->rootPath()));
 

fsview.qml

 ListView {
    width: 300
    height: 400

    model: DelegateModel {
        model: displayFileSystemModel
        rootIndex: rootPathIndex

        delegate: Rectangle {
            width: 200; height: 25
            Text {
                text: model.filePath
                Component.onCompleted: {
                    console.log(text)
                }
            }
        }
    }
}

 

Что я делаю не так?

Обновить

Итак, по-видимому, QFileSystemModel использует отдельный поток для заполнения самого себя и выдает сигнал directoryLoaded после завершения потока для загрузки пути.

Я попытался подключить свой view, чтобы устанавливать корневой индекс только после правильной загрузки пути, добавив следующий код в мой listview

     Connections {
        target: displayFileSystemModel
        function onDirectoryLoaded(path) { delegatemodel.rootIndex = rootPathIndex }
    }
 

Однако это не решает проблему. Грязным обходным путем было установить таймер, чтобы попытаться установить rootIndex через определенный промежуток времени.

     Timer {
        interval: 100
        running: true
        onTriggered: delegatemodel.rootIndex = examPathIndex
    }
 

И это «решает» проблему, но, конечно, далеко от удовлетворительного решения. Есть идеи?

ОБНОВЛЕНИЕ 2

Оказывается, каждый раз, когда модель обновляется (и запускается сигнал directoryLoaded), представление сбрасывается. Даже попытка переназначить rootIndex каждый раз при загрузке новых данных не работает.

Комментарии:

1. Что произойдет, если вы удалите эту rootIndex строку? Я просто смотрю на пример здесь , и они не устанавливаются rootIndex , пока вы не нажмете на папку.

2. @JarMan Если я удалю rootIndex, путь по умолчанию — это корень системы. Я хочу отобразить определенную папку и ее подпапки в моем приложении. Кроме того, когда я следую примеру, на который вы ссылались, проблема сохраняется: я могу щелкнуть по папке, чтобы получить доступ к ее вложенной папке, но каждые несколько секунд отображаемый путь снова возвращается к корню моей системы.