Russian Qt Forum
Ноябрь 23, 2024, 04:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Рекурсивное считывание папок  (Прочитано 2664 раз)
core
Гость
« : Май 19, 2011, 18:01 »

Нужно сделать обработку drop каталога с музыйкой с большим количеством подкаталогов. Делаю так.

Код:
 void MainWindow::dropEvent(QDropEvent *pe){
        QList<QUrl> urlList=pe->mimeData()->urls();
        emit sendDroppedData(urlList);
        pe->acceptProposedAction();
       }

void MainWindow::AddDroppedData(const QList<QUrl> &urlList){
    QStringList str;
    QString trystr;
    foreach (QUrl url, urlList ){
    trystr=url.toLocalFile();
    if (QFileInfo(trystr).isDir()){ //якщо доданий запис - папка  скануємо її вміст а записи
    QDir dir(trystr);
    if (dir.exists()){
    foreach (QString f,dir.entryList(QDir::Files)){
        QString ext=dir.filePath(f).right(3).toUpper();
        if (extensions.contains(ext))
        str<<dir.filePath(f);}
    emit sendDroppedFiles(str);//відправляємо на додавання те що є і скануємо далі папки
    str.clear();//очистити список з підкаталогу
    //рекурсивний if (сканування з суб-каталогів)
    QList<QUrl> newDirs;
    foreach(QString f, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) newDirs.append(QUrl::fromLocalFile(dir.filePath(f)));
    if (newDirs.size()!=0) sendDroppedData(newDirs);}}
    else {
        QString ext=trystr.right(3).toUpper();
        if (extensions.contains(ext))
        str<<trystr;
        }
        }
   emit sendDroppedFiles(str);//відправляємо ті записи, що є файлами на додавання до списку
}

Сигнал sendDroppesFiles отправляет список с файлами уже на добавление. Работает drop сразу файлов, и drop каталога, в ктором размещены файлы. Второй уровень подкаталогов уже не работает. Тоисть рекурсивный вызов

Код:
QList<QUrl> newDirs;
    foreach(QString f, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) newDirs.append(QUrl::fromLocalFile(dir.filePath(f)));
    if (newDirs.size()!=0) sendDroppedData(newDirs);}}
(sendDroppedData вызывает слот addDroppedData) дает

ASSERT failure in QList<T>::operator[]: "index out of range", file c:\Qt\Desktop\Qt\4.7.2\mingw\include/QtCore/qlist.h, line 464
Invalid parameter passed to C runtime function.

Мб кто знает в чем ошибка
Записан
core
Гость
« Ответ #1 : Май 19, 2011, 18:33 »

Посмотрел в отладчике - если в каталоге есть только подкаталоги без файлов
Код:
QList<QUrl> urlList=pe->mimeData()->urls();
        emit sendDroppedData(urlList);
вот тут и програма вылетает. urlList равен 0.
Записан
core
Гость
« Ответ #2 : Май 19, 2011, 18:56 »

Код:
Честь и хвала отладчику. Оказалось, что тут
foreach (QString f,dir.entryList(QDir::Files)){
        QString ext=dir.filePath(f).right(3).toUpper();
        if (extensions.contains(ext))
        str<<dir.filePath(f);}
    emit sendDroppedFiles(str);
надо проверять есть ли вообще в папке файлы кроме папок, а то иначе 0 идет, который не предусмотрен в функкции добавления в плейлист. Следовательно, пишем
Код:
Честь и хвала отладчику. Оказалось, что тут
foreach (QString f,dir.entryList(QDir::Files)){
        QString ext=dir.filePath(f).right(3).toUpper();
        if (extensions.contains(ext))
        str<<dir.filePath(f);}
if (str.size()>0)
    emit sendDroppedFiles(str);
и все работает
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 20.