#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, путь по умолчанию — это корень системы. Я хочу отобразить определенную папку и ее подпапки в моем приложении. Кроме того, когда я следую примеру, на который вы ссылались, проблема сохраняется: я могу щелкнуть по папке, чтобы получить доступ к ее вложенной папке, но каждые несколько секунд отображаемый путь снова возвращается к корню моей системы.