web-dev-qa-db-ja.com

QStringListを反復処理する方法

2つの異なるディレクトリを反復処理しようとしています。 2つのディレクトリは同じルート_/_にあります。

_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;
            }
        }
    }
}
_

リスト_dirs << "plugins" << "core_plugs";_の最初のディレクトリpluginsにのみアクセスできます。並べ替え_dirs << "core_plugs" << "plugins";_を使用すると、結果は同じになり、最初のディレクトリcore_plugsのみが解析されます。

なぜ私はこの振る舞いをするのですか、そしてどのようにして両方のディレクトリを反復させることができますか?.

[〜#〜]更新[〜#〜]

_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();
    }
}
_

Azeem の提案に従って、上記のように試行を更新しました。 foreachの後にcdUp();を実行しようとしました。つまり、

_foreach() {} pluginsDir.cdUp(); 
_

しかし、それは引っ掛かりません。もう手遅れです。それより早くて、反復が少なすぎます。私がそれについて特にどうやって取り組むことができるかを提案していただけませんか?

ご回答ありがとうございます!

8
Program-Me-Rev

以下は、C++ 11の 範囲ベースのQStringListループ を使用して for を反復処理する方法です。

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

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

しかし、私はあなたの問題は反復ではないと思います。あなたの問題は、ディレクトリにcdingしているが、ディレクトリから抜け出ていないことです。つまり、cd("..")またはcdUp()です。

あなたが言ったように、これらのディレクトリは両方とも同じパス、つまりルート_/_にあります。したがって、ネストされたループでの処理の後、ルートパスに戻って他のディレクトリにアクセスする必要があります。

成功したかどうかにかかわらず、cd関数の結果を確認するだけです。これはブール関数です。しかし、あなたのケースでは、エラー処理が欠落しています。エラー処理を行うと、次のようになります。

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

cd関数のdirs.at(i).toLocal8Bit().constData()を取得する必要はありません。 QStringかかります。

ここにその署名があります:

_bool QDir::cd( const QString& dirName );
_

ヒント: QDirIterator を使用してディレクトリを繰り返すこともできます。


以下は完全に機能する例です。

私はこれに従いましたディレクトリ構造

_C:\Test
-- A
---- a.txt
-- B
---- b.txt
_

コード

_#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;
}
_

出力

enter image description here

10
Azeem