crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QFileSystemModel и полное сканирование папок
dmsovetov
  опции профиля:
сообщение 15.12.2015, 21:37
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 4.12.2015
Пользователь №: 4495

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день.
Хотелось бы узнать, как можно заставить 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. да, знаю что там специально сделано, чтоб грузилось по требованию, но у меня специфическая задача :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.12.2015, 9:10
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 4.12.2015
Пользователь №: 4495

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 16.12.2015, 8:10) *
думаю, правильнее так - а вдруг количество строк поменяется ?
...
ну и полезно проверить

Попробовал. Не помогло :unsure:

Цитата(Алексей1153 @ 16.12.2015, 8:10) *
Ещё мне кажется, что нужен будет рекурсивный скан вглубь всего дерева. А сейчас только по первому уровню пробегаешь

Сигнал directoryLoaded будет вызываться для всех папок, которые я подгрузил через fetchMore.
Оно все грузит как надо, проблема в том, что drag'n'drop потом валится вот на таком асерте :(


PS прикрепляю минимальный проект к посту.
Прикрепленные файлы
Прикрепленный файл  FileSystemModel2.zip ( 1,84 килобайт ) Кол-во скачиваний: 229
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.12.2015, 12:56
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


dmsovetov,
ассерт намекает, что

ASSERT: "!fileName.isEmpty()" in file dialogs\qfilesystemmodel.cpp, line 1857

Кстати, даже просто переименовываю файл вне программы, моделька подхватывает и падает с таким же ассертом ))


Раскрывающийся текст
А как у тебя компилятор такое позволил
QTreeView::EditTrigger::EditKeyPressed , тоже так хочу :D

у меня только так
QTreeView::EditKeyPressed позволяет


мне сдаётся, что вот тут что-то не так

connect(this, SIGNAL(directoryLoaded(const QString &)), this, SLOT(directoryLoaded(const QString &)));
:D :D :D

Этот косячный коннект убираю - ассерт пропадает. Разбирайся, что ты имел в виду в этом коннекте
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dmsovetov
  опции профиля:
сообщение 16.12.2015, 13:31
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 4.12.2015
Пользователь №: 4495

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
мне сдаётся, что вот тут что-то не так

Та не, то у меня так слот называется, его можно по-другому называть - все равно асерт будет.

Цитата
Этот косячный коннект убираю - ассерт пропадает. Разбирайся, что ты имел в виду в этом коннекте

Ну конечно, он ведь больше не делает fetchMore, вот и ассерта нету :)

Цитата
А как у тебя компилятор такое позволил

У меня Visual Studio 2013 Community. Студия много чего неправильного позволяет, а потом оно под всякими GCC/LLVM под мак/иос/андроид не собирается, так что лучше с таким не баловаться :))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.12.2015, 13:37
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Думается мне, что у тебя программа уходит в бесконечную рекурсию, от того и accert
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.12.2015, 13:46
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


dmsovetov, не знаю, как насчёт одинаковых имён, я к своим слотам и сигналам приписываю префиксы slot_ и signal_ всегда, чтобы не нарываться на одинаковые имена ) Так, на всякий случай. Здесь вроде всё правильно компилятор понимает

ещё момент. Я добавил проверку
    if(!idx.isValid())
    {
        //после переименования файла вне программы попадаем сюда, однако
    }


и вот такой невалидный индекс ты передаёшь в rowCount, после чего ассерт показывается

Причину невалидности не знаю

ViGOur, рекурсии нету, поскольку указаны SLOT и SIGNAL , поэтому препроцессор вроде понимает их как разные сигнатуры
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.12.2015, 13:55
Сообщение #8


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Алексей1153 @ 16.12.2015, 13:46) *
ViGOur, рекурсии нету, поскольку указаны SLOT и SIGNAL , поэтому препроцессор вроде понимает их как разные сигнатуры
согласен, перепрочел, был невнимателен.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dmsovetov
  опции профиля:
сообщение 16.12.2015, 14:08
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 4.12.2015
Пользователь №: 4495

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей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
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


ага, я добавил и посмотрел - тоже про файлы подумал - но ты меня опередил ))

    qDebug()<<"path="<<path;
path= выводится путь к папке
path= выводится путь к файлу
ассерт

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.11.2024, 8:20