Версия для печати темы
Форум на CrossPlatform.RU _ Qt Модель/Представление _ QFileSystemModel и полное сканирование папок
Автор: dmsovetov 15.12.2015, 21:37
Добрый день.
Хотелось бы узнать, как можно заставить QFileSystemModel просканировать все папки начиная от корневого индекса модели.
Я пробовал дергать fetchMore, когда получаю сигнал directoryLoaded, но после этого там что-то ломается - перемещение файла просто валится на асерте внутри модели.
Вот так я пробовал сканировать:
void AssetsModel::directoryLoaded( const QString& path )
{
QModelIndex idx = index( path );
for( s32 i = 0, n = rowCount( idx ); i < n; i++ ) {
QModelIndex child = index( i, 0, idx );
if( canFetchMore( child ) ) {
fetchMode( child );
}
}
}
P.S. да, знаю что там специально сделано, чтоб грузилось по требованию, но у меня специфическая задача
Автор: Алексей1153 16.12.2015, 9:10
dmsovetov, что в ассерте то пишется ?
и сильно смущает такой подход
for( s32 i = 0, n = rowCount( idx ); i < n; i++ )
думаю, правильнее так - а вдруг количество строк поменяется ?
for( s32 i = 0; i < rowCount( idx ); i++ )
ну и полезно проверить
if(child.isValid())
- казалось бы, методы модели должны правильно реагировать на невалидные индексы. Ан нет, скажем, табличные модели прекрасно падают, если в некоторые методы передать невалидный индекс .
Ещё мне кажется, что нужен будет рекурсивный скан вглубь всего дерева. А сейчас только по первому уровню пробегаешь
Автор: dmsovetov 16.12.2015, 12:13
Цитата(Алексей1153 @ 16.12.2015, 8:10)
думаю, правильнее так - а вдруг количество строк поменяется ?
...
ну и полезно проверить
Попробовал. Не помогло
Цитата(Алексей1153 @ 16.12.2015, 8:10)
Ещё мне кажется, что нужен будет рекурсивный скан вглубь всего дерева. А сейчас только по первому уровню пробегаешь
Сигнал directoryLoaded будет вызываться для всех папок, которые я подгрузил через fetchMore.
Оно все грузит как надо, проблема в том, что drag'n'drop потом валится вот на таком асерте
PS прикрепляю минимальный проект к посту.
Автор: Алексей1153 16.12.2015, 12:56
dmsovetov,
ассерт намекает, что
ASSERT: "!fileName.isEmpty()" in file dialogs\qfilesystemmodel.cpp, line 1857
Кстати, даже просто переименовываю файл вне программы, моделька подхватывает и падает с таким же ассертом ))
А как у тебя компилятор такое позволил
QTreeView::EditTrigger::EditKeyPressed , тоже так хочу
у меня только так
QTreeView::EditKeyPressed позволяет
мне сдаётся, что вот тут что-то не так
connect(this, SIGNAL(
directoryLoaded(const QString &)), this, SLOT(
directoryLoaded(const QString &)));
Этот косячный коннект убираю - ассерт пропадает. Разбирайся, что ты имел в виду в этом коннекте
Автор: dmsovetov 16.12.2015, 13:31
Цитата
мне сдаётся, что вот тут что-то не так
Та не, то у меня так слот называется, его можно по-другому называть - все равно асерт будет.
Цитата
Этот косячный коннект убираю - ассерт пропадает. Разбирайся, что ты имел в виду в этом коннекте
Ну конечно, он ведь больше не делает fetchMore, вот и ассерта нету
Цитата
А как у тебя компилятор такое позволил
У меня Visual Studio 2013 Community. Студия много чего неправильного позволяет, а потом оно под всякими GCC/LLVM под мак/иос/андроид не собирается, так что лучше с таким не баловаться
)
Автор: ViGOur 16.12.2015, 13:37
Думается мне, что у тебя программа уходит в бесконечную рекурсию, от того и accert
Автор: Алексей1153 16.12.2015, 13:46
dmsovetov, не знаю, как насчёт одинаковых имён, я к своим слотам и сигналам приписываю префиксы slot_ и signal_ всегда, чтобы не нарываться на одинаковые имена ) Так, на всякий случай. Здесь вроде всё правильно компилятор понимает
ещё момент. Я добавил проверку
if(!idx.isValid())
{
//после переименования файла вне программы попадаем сюда, однако
}
и вот такой невалидный индекс ты передаёшь в rowCount, после чего ассерт показывается
Причину невалидности не знаю
ViGOur, рекурсии нету, поскольку указаны SLOT и SIGNAL , поэтому препроцессор вроде понимает их как разные сигнатуры
Автор: ViGOur 16.12.2015, 13:55
Цитата(Алексей1153 @ 16.12.2015, 13:46)
ViGOur, рекурсии нету, поскольку указаны SLOT и SIGNAL , поэтому препроцессор вроде понимает их как разные сигнатуры
согласен, перепрочел, был невнимателен.
Автор: dmsovetov 16.12.2015, 14:08
Цитата(Алексей1153 @ 16.12.2015, 12:46)
и вот такой невалидный индекс ты передаёшь в rowCount, после чего ассерт показывается
Обернул в проверку - все равно ассерт срабатывает
Может тут с потоками что-то не то? Ведь QFileSystemModel вобще в другом потоке сканирует.
Кажется понял. Надо вот так цикл поменять:
for( int i = 0; i < rowCount( parent ); i++ ) {
QModelIndex child = index( i, 0, parent );
// --- canFetchMore возвращает true для файлов и из-за этого
// --- все рушится, на скан надо отдавать только папки
if( !fileInfo( child ).isDir() ) {
continue;
}
if( canFetchMore( child ) ) {
fetchMore( child );
}
}
Автор: Алексей1153 16.12.2015, 14:23
ага, я добавил и посмотрел - тоже про файлы подумал - но ты меня опередил ))
qDebug()<<"path="<<path;
path= выводится путь к папке
path= выводится путь к файлу
ассерт
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)