web-dev-qa-db-fra.com

Comment parcourir une liste QStringList

J'essaie de parcourir deux répertoires différents. Les deux répertoires sont sur la même racine /.

void MainWindow::loadPlugins()
{
    pluginsDir = QDir(qApp -> applicationDirPath());

#if defined(Q_OS_WIN)
    if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
        pluginsDir.cdUp();
#Elif defined(Q_OS_MAC)
    if (pluginsDir.dirName() == "MacOS") {
        pluginsDir.cdUp();
        pluginsDir.cdUp();
        pluginsDir.cdUp();
    }
#endif

    QStringList dirs;
    dirs << "plugins" << "core_plugs";

    QList<QObject *> loadedPlugs;

    for (int i = 0; i < dirs.size(); ++i)
    {
        cout << dirs.at(i).toLocal8Bit().constData() << endl;

        pluginsDir.cd(dirs.at(i).toLocal8Bit().constData());

        foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
            QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
            QObject *plugin = loader.instance();
            qDebug() << "NAME :: " << fileName;
            if (plugin && !(loadedPlugs . contains(plugin))) {
                loadedPlugs << plugin;
                dirs . removeAt(i);
            } else {
                continue;
            }
        }
    }
}

Je ne peux entrer que dans le premier répertoire plugins dans la liste dirs << "plugins" << "core_plugs";. Avec une nouvelle commande dirs << "core_plugs" << "plugins";, Les résultats sont les mêmes et seul le premier répertoire, core_plugs est analysé.

Pourquoi est-ce que j'obtiens ce comportement et comment puis-je le faire parcourir les deux répertoires.

[~ # ~] mise à jour [~ # ~]

void MainWindow::loadPlugins()
{
    pluginsDir = QDir(qApp -> applicationDirPath());

#if defined(Q_OS_WIN)
    if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
        pluginsDir.cdUp();
#Elif defined(Q_OS_MAC)
    if (pluginsDir.dirName() == "MacOS") {
        pluginsDir.cdUp();
        pluginsDir.cdUp();
        pluginsDir.cdUp();
    }
#endif

    QStringList dirs;
    dirs << "plugins" << "core_plugs";

    QList<QObject *> loadedPlugs;

    for (int i = 0; i < dirs.size(); ++i)
    {
        pluginsDir.cd(dirs.at(i).toLocal8Bit().constData());

        foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
            QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
            QObject *plugin = loader.instance();
            if (plugin && !(loadedPlugs . contains(plugin))) {
                populateRevPlugins(plugin);
                loadedPlugs << plugin;
            }
        }
        qDebug() << pluginsDir . absolutePath();
        pluginsDir.cdUp();
        qDebug() << pluginsDir . absolutePath();
    }
}

Suite à la suggestion de Azeem , j'ai mis à jour ma tentative comme indiqué ci-dessus. J'ai essayé de cdUp(); après le foreach c'est-à-dire:

foreach() {} pluginsDir.cdUp(); 

Mais, il ne se fait pas attraper. Il est trop tard là-bas. Plus tôt que cela et je reçois trop peu d'itérations. Pourriez-vous s'il vous plaît suggérer comment je peux m'y prendre en particulier?

Merci pour votre réponse!

8
Program-Me-Rev

Voici comment vous pouvez parcourir une QStringList en utilisant C++ 11 boucle basée sur la plage for :

const QStringList list { "A", "B", "C" };

for ( const auto& i : list  )
{
    qDebug() << i;
}

Mais, je crois que votre problème n'est pas l'itération. Votre problème est que vous cd entrez dans un répertoire sans en sortir, c'est-à-dire cd("..") ou cdUp().

Comme vous l'avez dit, ces deux répertoires sont dans le même chemin, c'est-à-dire root /. Ainsi, après le traitement dans la boucle imbriquée, vous devez revenir au chemin racine pour accéder à l'autre répertoire.

Vous pouvez simplement vérifier le résultat de la fonction cd si elle a réussi ou non. Il s'agit d'une fonction booléenne. Mais, dans votre cas, la gestion des erreurs est manquante. Avec la gestion des erreurs, cela devrait être comme ceci:

if ( dir.cd( path ) )
{
    // Do something here...
}

Vous n'avez pas besoin d'obtenir la dirs.at(i).toLocal8Bit().constData() pour la fonction cd. Il faut un QString.

Voici sa signature:

bool QDir::cd( const QString& dirName );

Astuce: Vous pouvez également utiliser QDirIterator pour itérer un répertoire.


Voici un exemple de travail complet.

J'ai suivi cette structure de répertoires:

C:\Test
-- A
---- a.txt
-- B
---- b.txt

Code :

#include <QStringList>
#include <QDebug>
#include <QDir>
#include <cstdlib>

int main( void )
{
    const QString     root { "C:/Test" };
    const QStringList dirs { "A", "B" };

    QDir rootDir { root };
    qDebug() << "Root Path:" << rootDir.absolutePath();
    qDebug() << "Root List:" << rootDir.entryList( QDir::Dirs ) << '\n';

    for ( const auto& dir : dirs  )
    {
        if ( rootDir.cd( dir ) )
        {
            qDebug() << "Dir Path:" << rootDir.absolutePath();
            qDebug() << "Dir List:" << rootDir.entryList( QDir::Files ) << '\n';
        }

        rootDir.cdUp();
        qDebug() << "cding...";
        qDebug() << "Dir Path:" << rootDir.absolutePath() << '\n';
    }

    return EXIT_SUCCESS;
}

Sortie :

enter image description here

10
Azeem