QDirIterator изменить dir

291
21 февраля 2017, 18:00

Есть функция getFileInfo

bool getFileInfo (QDir dir, QFileInfo *tmp) {
    QDirIterator it(dir, QDirIterator::Subdirectories);
    while (it.hasNext()) {
        *tmp = it.fileInfo();
        it.next();
        return true;
    }
    return false;
}

которая принимает путь к файлам и возвращает один файл по ссылке.

Идёт вызов функции для получения всех файлов папки

while (getFileInfo(dir1, &fileInfo)){
    ...
}
while (getFileInfo(dir2, &fileInfo)){
    ...
}

Сейчас функция уйдёт в бесконечный цикл, однако, если добавить static для QDirIterator, то нельзя будет указывать другой путь к файлам.

Как организовать нормальную работу с QDirIterator?

P.S. идеальный вариант - объявить пустой QDirIterator в классе, и как-нибудь изменять его перед

while (getFileInfo(dir1, &fileInfo)){
    ...
}
Answer 1

Можно напрямую в цикле использовать итератор. То есть вместо функции просто используйте цикл в ее теле.

Другой подход - это создать объект функции.

Например,

class GetFileInfo
{
protected:
    QDirIterator it;
public:
    GetFileInfo ( const QDir &dir ) : it(dir, QDirIterator::Subdirectories)
    {
    }
    bool operator ()( QFileInfo *tmp )
    {
        bool success = it.hasNext();
        if ( success )
        {
            it.next();
            *tmp = it.fileInfo();
        }
        return success;
    }
};

И использовать его как

GetFileInfo fileinfo( dir );
while ( fileInfo( &tmp ) )
{
    //...
}

Можно также добавить явную функцию преобразования объекта класса в тип bool.

Тогда можно будет писать

while ( fileInfo )
{
    fileInfo( &tmp );
    //...
}

Так как я не имел дело с Qt, то возможно есть неточности в определении объекта функции. Тем не менее он демонстрирует подход к решению задачи.

READ ALSO
Кубическая интерполяция [требует правки]

Кубическая интерполяция [требует правки]

Набор аргументов для которых необходимо найти интерполируемые значения(t1):

391
Перегрузка оператора + для сложения 2 массивов

Перегрузка оператора + для сложения 2 массивов

Доброго времени суток! Нужно перегрузить оператор + для сложение двух двумерных массивовПыталась перегрузить так, но это вызывает исключение

304
Интерполяция на сетку Вороного

Интерполяция на сетку Вороного

Подскажите библиотеку на C++ в которой реализован метод интерполяции с регулярной сетки на сетку ВороногоКак я понял нужно искать все пересечения...

235
Выдача экранной формы на странице ввода пароля Win

Выдача экранной формы на странице ввода пароля Win

Как написать программу, которая бы могла на странице входа пользователя в систему выдать какую-нибудь экранную формуТипа Hello World

255