Название: Рекурсивное считывание папок
Отправлено: 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.Мб кто знает в чем ошибка
Название: Re: Рекурсивное считывание папок
Отправлено: core от Май 19, 2011, 18:33
Посмотрел в отладчике - если в каталоге есть только подкаталоги без файлов QList<QUrl> urlList=pe->mimeData()->urls(); emit sendDroppedData(urlList); вот тут и програма вылетает. urlList равен 0.
Название: Re: Рекурсивное считывание папок
Отправлено: core от Май 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); и все работает
|